Python 这是检查参数值是否属于定义的值范围的正确方法吗?
我使用下面的“assert”来验证函数中的参数值 我有一个函数“test”,它接受一个布尔输入“arg1”,它可以是None,True或False。确定“arg1”只是其中一个可能的值可以吗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=)。在中执行
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
。您建议为此使用合同吗?