2

我正在用 Python 编写一些测试,对于其中一个测试,我需要验证一个值是 int 还是可以干净地转换为 int。

应该通过:

0
1
"0"
"123456"

应该失败:

""
"x"
"1.23"
3.14

我怎样才能最好地写出这个断言?

4

7 回答 7

5

因此,要 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

在下面的答案中,有一个检查,使用类型转换和相等检查,但我认为它不适用于大整数。

也许有更短的方法

于 2013-05-09T14:35:30.177 回答
2

使用 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
于 2013-05-09T14:35:10.930 回答
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
于 2013-05-09T14:35:42.690 回答
1

您可以使用正则表达式来准确指定您愿意接受的整数字符串格式。例如

re.match(r"\d+\.?0*", string)

将匹配任何至少有一个数字的字符串,可选地后跟一个小数点和一些零。

于 2013-05-09T14:49:12.263 回答
1

做就是了:

def is_int(x):
    try:
        return int(x) == float(x)
    except ValueError:
        return False
于 2013-05-09T14:34:37.123 回答
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
>>>
于 2013-05-09T14:36:22.717 回答
0

我有一个稍微短一点的解决方案:

def is_mostly_int(val):
    try:
        return str(int(val)) == str(val)
    except (ValueError, TypeError):
        return False

但是,它不会接受诸如“1E10”或“1.00000”之类的东西。

于 2013-05-09T15:27:57.743 回答