这是检查参数值是否是定义的值范围的一部分的正确方法吗?

时间:2016-05-19 14:03:24

标签: python python-2.7

我使用以下“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。你必须保持单独的是。

这是对的吗?

2 个答案:

答案 0 :(得分:4)

对于None,你的朋友是正确的;你应该总是使用身份来测试它,除非你只是“没有”(你几乎从来没有)。

对于TrueFalse,您需要检查是否需要确切的值,或者是否只需要真实性。如果是前者,那么你可以使用in来测试它们,但是如果是后者那么你根本不应该测试,只需在布尔上下文中使用它时将参数传递给bool()。 / p>

但是你的代码中还有另一个问题,你们都错过了:

断言不应用于决策。

当操作对系统产生有害影响时,应使用断言,而不仅仅是验证输入。

答案 1 :(得分:4)

如果您需要身份测试,则必须使用" is。"你的朋友是正确的,因为"在"使用相等测试。例如:

a = [0, 1]
False in a
>> True
a[0] is False
>> False

如果有人传入0,则不会触发你的断言。你可能没想到。