我正在用 Python 编写一些测试,对于其中一个测试,我需要验证一个值是 int 还是可以干净地转换为 int。
应该通过:
0
1
"0"
"123456"
应该失败:
""
"x"
"1.23"
3.14
我怎样才能最好地写出这个断言?
我正在用 Python 编写一些测试,对于其中一个测试,我需要验证一个值是 int 还是可以干净地转换为 int。
应该通过:
0
1
"0"
"123456"
应该失败:
""
"x"
"1.23"
3.14
我怎样才能最好地写出这个断言?
因此,要 100% 确定,它必须是这样的:
def is_integery(val):
if isinstance(val, (int, long)): # actually integer values
return True
elif isinstance(val, float): # some floats can be converted without loss
return int(val) == float(val)
elif not isinstance(val, basestring): # we can't convert non-string
return False
else:
try: # try/except is better then isdigit, because "-1".isdigit() - False
int(val)
except ValueError:
return False # someting non-convertible
return True
在下面的答案中,有一个检查,使用类型转换和相等检查,但我认为它不适用于大整数。
也许有更短的方法
使用 isnumeric() 函数,如:
>>> test = "X"
>>> test = str(test)
>>> test.isnumeric()
False
尝试/除了作品。但我不认为这是一个好主意。Try/ except 应该用于预期的错误,而不是用于其他特定目的/功能。
更新:如果你想取负整数为真:
>>> def is_int(test):
test = str(test)
if len(test) != 0 and test[0] == "-":
test = test[1:]
return test.isnumeric()
>>> is_int(124)
True
>>> is_int(12.4)
False
>>> is_int("")
False
>>> is_int("X")
False
>>> is_int("123")
True
PS:我不确定“可以干净地转换为int”。如果这意味着 1.0000 应该通过,那么下面的代码应该可以工作:
>>> test = 3.14
>>> test = str(test)
>>> pattern = "[+-]?[0-9]+(\.)?(0)*\Z"
>>> re.match(pattern, test) != None
对类型转换问题使用 try/except 块,然后对非整数值进行相等检查。
def is_int(val):
try:
int_ = int(val)
float_ = float(val)
except:
return False
if int_ == float_:
return True
else:
return float_ / int(float_) == 1
做就是了:
def is_int(x):
try:
return int(x) == float(x)
except ValueError:
return False
>>> def isInt(v):
... assert str(v).isdigit()
>>> isInt(1)
>>> isInt(3.14)
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "<input>", line 2, in isInt
AssertionError
>>> isInt('')
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "<input>", line 2, in isInt
AssertionError
>>>
我有一个稍微短一点的解决方案:
def is_mostly_int(val):
try:
return str(int(val)) == str(val)
except (ValueError, TypeError):
return False
但是,它不会接受诸如“1E10”或“1.00000”之类的东西。