参数存在通过标识或布尔运算进行检查?

时间:2015-06-04 00:50:35

标签: python

在检查方法的参数以查看它们是否已设置时,进行身份检查是否是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

1 个答案:

答案 0 :(得分:4)

考虑如果arg2等于"Falsish" value(例如零)(或空字符串,列表,元组,字典或集合 - 仅举几例)会发生什么。然后

arg2 = arg2 or myClass()

会将arg2设置为myClass(),即使arg2=0可能是arg2的预期值。所以always use is to determine if arg2 is None