使用Python断言 - 如何检查输入是否为整数?

时间:2017-10-20 13:45:36

标签: python assert

我写了一个函数,它将一个数字作为输入。 例如:

def return_it_back(n):
    return n

我只需要使用断言检查输入是否为整数。 所以,我写了一个测试函数:

def test():
    assert return_it_back("k"), "incorrect input"
test()

Python没有显示&#34;不正确的输入&#34;。没有断言return_it_back(&#34; k&#34;),&#34;不正确的输入&#34; 需要打印&#34;错误的输入&#34;?< / p>

2 个答案:

答案 0 :(得分:6)

assert condition, message只是语法糖:

if not condition:
    raise AssertionError(message)

在您的代码中,return_it_back()只返回它的参数,所以

assert return_it_back(n), message

相当于

assert n, message

相当于

if not n:
    raise AssertionError(message)

所以测试的是n的真值,无论它是什么。

在Python中,所有对象都有一个布尔值 - 空集合(至少是内置的),空字符串,数字零和None具有错误值,而大多数其他对象默认具有真值。 / p>

IOW,除非n是一个空集合,空字符串,数字零或None它将eval为True并且断言将成功。

如果要测试对象是否属于给定类(或类列表),可以使用isinstance(obj, cls)(或isinstance(obj, cls, othercls, etc))。 Typechecking参数通常被认为是unpythonic(只要对象按预期运行,谁关心它是什么类型,AKA duck typing),但有几个地方有意义 - 当在子系统边界处消毒用户输入,并最终保证任何其他类型都会以这种或那种方式破坏功能。

此外,assert是一个编码器工具,而不是用于参数验证的东西 - 如果您的代码是使用--optimize标志编译的,例如断言语句将被忽略。它对单元测试很好(但unittest包中有更多高级工具)或调试但不适用于生产代码。如果你真的想阻止你的函数接受除了整数以外的任何东西,你应该提出一个TypeError(或ValueError,如果你想要一个正整数而得到一个负整数)。

答案 1 :(得分:4)

有几种方法,一种可能是

def return_it_back(n):
    assert type(n) == int, "Incorrect input"
    return n

return_it_back(123)
return_it_back('123')

这显然会在第二次尝试时中断。

<小时/> 您还可以使用

检查返回值
def return_it_back(n):
    return n

assert type(return_it_back(123)) == int, "Incorrect input"
assert type(return_it_back('123')) == int, "Incorrect input"

但这是多余的,因此不予考虑&#34; pythonic&#34;。采取第一种选择。