我总是以if not value
的风格编码,然而,一些指南引起了我的注意,虽然这种风格有效,但似乎有两个潜在的问题:
if value is None
肯定更容易理解。[]
和0
这样的东西也将评估为False
。我也开始将这个想法应用于其他比较,例如:
if not value
vs if value is False
if not value
vs if value is []
列表也是如此......
问题是,你对这个原则有多远?在哪里划线,同时保持代码安全?
我应该总是使用if value is None
风格,不管是什么?
如果这是您想要的,请使用与None的比较。如果您只想检查该值是否为false(空列表,无,false),请使用“if not value”。
我发现“如果没有价值”,那就更清洁了,而Pythonic。
另外,请注意列表。在比较空列表时,不应使用is。如果您知道要获取列表,请使用“if”检查它是否包含任何内容(或len())。尝试在解释器中输入:
>>> a = []
>>> a is []
False
这是因为您刚刚创建的临时列表在内存中的地址与存储在“a”中的地址不同。您没有看到None,False或True,因为这些都是单例的值(它们都指向相同的内存部分),因此使用'is'关键字有效。
您还会发现CPython实习字符串以便以下工作。
>>> 'a' is 'a'
True
你不应该依赖于此。这是一个实现细节,并未指定适用于每个Python版本。
不。如果你想在值为false但不是None
时运行代码,这将失败。
如果您正在检查与is None
对象的身份,请使用None
。如果您只想让值为False,请使用not value
。
你使用is
算子有点问题。例如,if value is []
将始终为false,因为没有两个活动列表具有相同的标识。它与None
一起工作很好,因为None
是一个单身人士(所有对None
的引用都是同一个对象)但是对于其他比较,使用==
。
然而,if value
和if not value
是完全可读和有用的。恕我直言,没有必要更具体,除非你需要不同地处理各种类型的真实或虚假的值,例如,区分0和None
。
我的回答很简单,因为它适用于大多数编码问题:不要试图写一些有效的东西。尽可能清楚地表达您的意图。如果要检查值是否为false,请使用if not value
。如果你想检查None
,请记下来。它总是取决于情况和你的判断。
你不应该试图找到可以不加思考地应用的规则。如果你找到这些规则,那就是计算机的工作,而不是人类! ;-)
if not value:
pass
很好,“pythonic”。它不会导致细微的错误,规则是明确的(我发现)easy to understand。
如果您需要区分False和None,正如您所提到的那样:
if not value is None: # or False, or == [], etc.
pass
# more readable
if value is not None: # or False, or != [], etc.
pass
我发现以上很少有必要。
一般来说,优先考虑积极的条件,并将它们放在第一位。它们一目了然更容易理解,并且随着复杂性的增加而保持良好(似乎总是如此)。
if value:
pass
else:
pass