oro*_*aki 687 python coding-style boolean-expression
我一直认为if not x is None
版本更清晰,但谷歌的风格指南和PEP-8都使用if x is not None
.是否存在任何轻微的性能差异(我假设没有),是否存在任何一个真正不合适的情况(使另一个成为我公约的明显赢家)?*
*我指的是任何单身人士,而不仅仅是None
.
...比较像无的单身人士.使用是否.
Dan*_*ach 927
没有性能差异,因为它们编译为相同的字节码:
Python 2.6.2 (r262:71600, Apr 15 2009, 07:20:39)
>>> import dis
>>> def f(x):
... return x is not None
...
>>> dis.dis(f)
2 0 LOAD_FAST 0 (x)
3 LOAD_CONST 0 (None)
6 COMPARE_OP 9 (is not)
9 RETURN_VALUE
>>> def g(x):
... return not x is None
...
>>> dis.dis(g)
2 0 LOAD_FAST 0 (x)
3 LOAD_CONST 0 (None)
6 COMPARE_OP 9 (is not)
9 RETURN_VALUE
Run Code Online (Sandbox Code Playgroud)
在风格上,我尽量避免not x is y
.尽管编译器总是将其视为not (x is y)
,但人类读者可能会误解构造(not x) is y
.如果我写,x is not y
那么没有歧义.
Xav*_* Ho 180
谷歌和Python的风格指南都是最佳实践:
if x is not None:
# Do something about x
Run Code Online (Sandbox Code Playgroud)
使用not x
会导致不必要的结果.见下文:
>>> x = 1
>>> not x
False
>>> x = [1]
>>> not x
False
>>> x = 0
>>> not x
True
>>> x = [0] # You don't want to fall in this one.
>>> not x
False
Run Code Online (Sandbox Code Playgroud)
您可能有兴趣了解在Python中True
或False
在Python 中评估的文字:
编辑以下评论:
我刚做了一些测试.not x is None
是没有x
先不否定然后比较None
.实际上,is
当使用这种方式时,运算符似乎具有更高的优先级:
>>> x
[0]
>>> not x is None
True
>>> not (x is None)
True
>>> (not x) is None
False
Run Code Online (Sandbox Code Playgroud)
因此,not x is None
在我的诚实意见中,最好避免.
更多编辑:
我刚做了更多的测试,可以确认bukzor的评论是正确的.(至少,我无法证明这一点.)
这意味着if x is not None
具有确切的结果if not x is None
.我纠正了.谢谢bukzor.
但是,我的回答仍然是:使用传统的if x is not None
.:]
Mar*_*som 126
代码应该首先编写为程序员可以理解,然后编译器或解释器编写."不是"构造比"不是"更接近英语.
Gle*_*ard 30
答案比人们做得简单得多.
有没有技术优势无论哪种方式,而"x是不是Y"是什么其他人使用,这使得它明显的赢家.它"看起来更像英语"并不重要; 每个人都使用它,这意味着Python中的每个用户-即使中国用户,其语言Python的看上去一点也不像-将一目了然,其中不太常用的语法将需要几个额外的大脑周期来分析理解.
不要只是为了与众不同,至少在这个领域是不同的.
Aar*_*all 30
Python
if x is not None
还是if not x is None
?
TLDR:字节码编译器将它们都解析为x is not None
- 所以为了便于阅读,请使用if x is not None
.
我们使用Python是因为我们重视人的可读性,可用性以及各种编程范式对性能的正确性.
Python优化了可读性,尤其是在此上下文中.
的not
结合更弱比is
,所以这里没有逻辑的差异.查看文档:
对象标识的运算符
is
和is not
测试:x is y
当且仅当x和y是同一个对象时才为真.x is not y
产生反向真值.
将is not
有具体规定,在Python 语法作为语言可读性改善:
comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'|'is' 'not'
Run Code Online (Sandbox Code Playgroud)
所以它也是语法的单一元素.
当然,它没有被解析:
>>> import ast
>>> ast.dump(ast.parse('x is not None').body[0].value)
"Compare(left=Name(id='x', ctx=Load()), ops=[IsNot()], comparators=[Name(id='None', ctx=Load())])"
>>> ast.dump(ast.parse('not x is None').body[0].value)
"UnaryOp(op=Not(), operand=Compare(left=Name(id='x', ctx=Load()), ops=[Is()], comparators=[Name(id='None', ctx=Load())]))"
Run Code Online (Sandbox Code Playgroud)
但是字节编译器实际上将转换not ... is
为is not
:
>>> import dis
>>> dis.dis(lambda x, y: x is not y)
1 0 LOAD_FAST 0 (x)
3 LOAD_FAST 1 (y)
6 COMPARE_OP 9 (is not)
9 RETURN_VALUE
>>> dis.dis(lambda x, y: not x is y)
1 0 LOAD_FAST 0 (x)
3 LOAD_FAST 1 (y)
6 COMPARE_OP 9 (is not)
9 RETURN_VALUE
Run Code Online (Sandbox Code Playgroud)
因此,为了便于阅读和使用预期的语言,请使用is not
.
不使用它是不明智的.
Mik*_*ham 11
出于风格原因,is not
操作者优先于否定结果is
." if x is not None:
"读起来就像英语,但" if not x is None:
"需要理解运算符优先级,而不是像英语那样读.
如果我的钱存在性能差异is not
,但这几乎肯定不是决定更喜欢这种技术的动机.它显然是依赖于实现的.由于is
不可覆盖,无论如何都应该很容易优化任何区别.
就个人而言,我用
if not (x is None):
Run Code Online (Sandbox Code Playgroud)
每个程序员都可以立即理解,即使是那些不熟悉Python语法的程序员.