我使用以下“assert”来验证函数中的参数值 我有一个函数“test”,它接受一个布尔输入“arg1”,可以是None,True或False。可以确保“arg1”只是其中一个可能的值吗?
def test(arg1=None):
assert arg1 in set([None, True, False]), "Not a valid input"
...
我的朋友告诉我以下内容:
不能这样做。你必须比较True,False和None作为身份(不是=)。执行in等效于multiple ='s。你必须保持单独的是。
这是对的吗?
答案 0 :(得分:4)
对于None
,你的朋友是正确的;你应该总是使用身份来测试它,除非你只是“没有”(你几乎从来没有)。
对于True
或False
,您需要检查是否需要确切的值,或者是否只需要真实性。如果是前者,那么你可以使用in
来测试它们,但是如果是后者那么你根本不应该测试,只需在布尔上下文中使用它时将参数传递给bool()
。 / p>
但是你的代码中还有另一个问题,你们都错过了:
断言不应用于决策。
当操作对系统产生有害影响时,应使用断言,而不仅仅是验证输入。
答案 1 :(得分:4)
如果您需要身份测试,则必须使用" is。"你的朋友是正确的,因为"在"使用相等测试。例如:
a = [0, 1]
False in a
>> True
a[0] is False
>> False
如果有人传入0,则不会触发你的断言。你可能没想到。