Python中if或if/elif语句的最佳实践是在末尾包含else:pass语句吗?

6
如果我写下这样的代码:
if a == b:
    # do something
elif a == c:
    # do something else

我只是想通过,否则,需要在最后写出以下内容吗?
else:
    pass

在解释器中,似乎没有else:语句也能正常运行,我是否应该在这种情况下始终包含else: pass

3个回答

18
不是的,else 语句是完全可选的。
来自if语句文档
...

if_stmt ::=  "if" expression ":" suite
             ( "elif" expression ":" suite )*
             ["else" ":" suite]
(...)* 表示零个或多个,[...] 表示可选。因此,一个有效的 if 复合语句包括一个 if 行和其对应的代码块、0 个或多个 elif 行和相应的代码块,以及最多一个可选的 else 行和其对应的代码块。
Python 编译器将忽略任何 else: pass 块,实际上包含它没有任何意义。
>>> import dis
>>> dis.dis(compile('''\
... if True:
...     foo
... else:
...     pass
... ''', '<stdin>', 'exec'))
  1           0 LOAD_NAME                0 (True)
              3 POP_JUMP_IF_FALSE       13

  2           6 LOAD_NAME                1 (foo)
              9 POP_TOP             
             10 JUMP_FORWARD             0 (to 13)

  4     >>   13 LOAD_CONST               0 (None)
             16 RETURN_VALUE        
>>> dis.dis(compile('''\
... if True:
...     foo
... ''', '<stdin>', 'exec'))
  1           0 LOAD_NAME                0 (True)
              3 POP_JUMP_IF_FALSE       13

  2           6 LOAD_NAME                1 (foo)
              9 POP_TOP             
             10 JUMP_FORWARD             0 (to 13)
        >>   13 LOAD_CONST               0 (None)
             16 RETURN_VALUE        

唯一的区别在于第一个源代码样例中由于有额外的行而使得LOAD_CONST字节码附加了行号。

从风格上讲,else: pass只是一种杂物,会降低可读性。


3

即使没有最佳实践,也不要忽视更好的实践。

'else:'子句并不是必需的,然而……逻辑和语法规则除外,在使用'if-elif-elif-elif...else: pass'块时,作者有机会记录在可能经过多个if-elif检查后仍未满足的条件。将来,如果出现意外的“角落情况”,这些文档可能非常有帮助,帮助找到错误。


1

ifelif语句后面不需要加上else。唯一需要使用else的地方是当你想要在if语句不成立时执行某些操作时。例如:

if a == b:
    myString = "true"
else:
    myString = "false";

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接