我写了一个函数,它将一个数字作为输入。 例如:
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>
答案 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;。采取第一种选择。