我正在用Python编写一些测试,我需要验证其中一个值是int还是可以干净地转换为int。
应该通过:
0
1
"0"
"123456"
应该失败:
""
"x"
"1.23"
3.14
我怎样才能最好地写出这个断言?
答案 0 :(得分:4)
所以,要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
在下面的答案中,thre是一个检查,使用类型转换和相等检查,但我认为它对大整数不会正常工作。
也许有更短的方式
答案 1 :(得分:2)
对类型转换问题使用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
答案 2 :(得分:1)
只是做:
def is_int(x):
try:
return int(x) == float(x)
except ValueError:
return False
答案 3 :(得分:1)
使用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
答案 4 :(得分:1)
>>> 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
>>>
答案 5 :(得分:1)
您可以使用regular expressions准确指定您愿意接受的整数的字符串格式。 E.g。
re.match(r"\d+\.?0*", string)
将匹配任何至少有一位数的字符串,可选地后跟一个小数点和一些零。
答案 6 :(得分:0)
我的解决方案略短:
def is_mostly_int(val):
try:
return str(int(val)) == str(val)
except (ValueError, TypeError):
return False
但它不会接受“1E10”或“1.00000”之类的东西。