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

Or.*_*uha 2 python assert

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

def return_it_back(n):
    return n
Run Code Online (Sandbox Code Playgroud)

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

def test():
    assert return_it_back("k"), "incorrect input"
test()
Run Code Online (Sandbox Code Playgroud)

Python没有显示"输入错误".不将断言return_it_back("K"),"不正确输入"需要打印的"不正确输入"?

bru*_*ers 6

assert condition, message 只是语法糖:

if not condition:
    raise AssertionError(message)
Run Code Online (Sandbox Code Playgroud)

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

assert return_it_back(n), message
Run Code Online (Sandbox Code Playgroud)

相当于

assert n, message
Run Code Online (Sandbox Code Playgroud)

这相当于

if not n:
    raise AssertionError(message)
Run Code Online (Sandbox Code Playgroud)

所以经过测试的是真实价值n,无论它是什么.

在Python中,所有对象都有一个布尔值 - 空集合(至少是内置的),空字符串,数字零和None假值以及大多数其他对象默认具有真值.

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

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

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