如何在Python中将最好的断言值转换为int?

时间:2013-05-09 14:32:15

标签: python testing assertions

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

应该通过:

0
1
"0"
"123456"

应该失败:

""
"x"
"1.23"
3.14

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

7 个答案:

答案 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”之类的东西。