Python 这是检查参数值是否属于定义的值范围的正确方法吗?

Python 这是检查参数值是否属于定义的值范围的正确方法吗?,python,python-2.7,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作为标识进行比较(is not=)。在中执行

我使用下面的“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作为标识进行比较(is not=)。在中执行一个操作相当于多个class='s。你必须保持独立的is


对吗

您的朋友在
的情况下是正确的;你应该始终使用身份来测试它,除非你对“无”感到满意(你几乎永远不会这样)

至于
True
False
,您需要检查是否需要精确的值,或者是否只需要真实性。如果是前者,则可以在中使用
,对其进行测试;如果是后者,则在布尔上下文中使用时,不应进行任何测试,只需将参数传递给
bool()

但代码中还有一个问题,你们两人都没有注意到:

断言不应用于决策


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

如果需要身份测试,必须使用“是”。您的朋友是正确的,因为“in”使用平等测试。例如:

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

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

是的,没错<{True,False,None}中的code>1
返回
True
any(在{True,False,None}中,1是o代表o)
返回
False
。您建议为此使用合同吗?