在检查方法的参数以查看它们是否已设置时,进行身份检查是否是pythonic:
def doThis(arg1, arg2=None):
if arg2 is None:
arg2 = myClass()
或者使用短路布尔值是正确的形式:
def doThis(arg1, arg2=None):
arg2 = arg2 or myClass()
支持前者,PEP 8州:
比较像单曲这样的单身人士应该总是使用is或 不是,从来不是平等的运营商。另外,如果是x,请注意写作 当你的意思是x不是None时 - 例如在测试是否一个 默认为None的变量或参数设置为其他 值。另一个值可能有一个类型(如容器) 在布尔上下文中可能是假的!
另一方面,来自Google style guide:
如果可能,请使用“隐含”false。 ...
但与此同时表明......
永远不要使用==或!=来比较像无的单身人士。使用是否。
这是否适用于“None”,因为它总是评估为False,和/或是一个等效于== /!=的布尔比较?
修改: 要回答最后一个问题,“或”似乎并不等同于“==”:
In [17]: timeit.timeit("1 or None", number=100000000)
Out[17]: 2.0310521125793457
In [18]: timeit.timeit("1 is None", number=100000000)
Out[18]: 2.618263006210327
In [19]: timeit.timeit("1 == None", number=100000000)
Out[19]: 4.554893970489502
答案 0 :(得分:4)
考虑如果arg2
等于"Falsish" value(例如零)(或空字符串,列表,元组,字典或集合 - 仅举几例)会发生什么。然后
arg2 = arg2 or myClass()
会将arg2
设置为myClass()
,即使arg2=0
可能是arg2
的预期值。所以always use is
to determine if arg2
is None。