在非必须的else语句中使用pass

8
根据PEP8文档,我未能找到任何关于是否出于美观原因在代码中使用pass的参考。根据下面的示例,我应该保留这些else还是可以删除它们?到目前为止,我保留它们的主要原因是基于“明确优于隐式”的信条。
if fields:
    for i in foo:
        if i == 'something':
            print "something"
        else:
            pass
else:
    pass

12
不要混淆“显式”和“冗余”。 - Bill N.
1
如果你使用 for i in filter(lambda i: i == 'something', foo) 这样的代码,那么你甚至不需要考虑 else - KillianDS
5
无论使用何种编程语言,一般来说,无用的代码都应该被删除。 - Max Noel
5个回答

17

是的,你可以/应该删除它们,因为它们没有任何作用。

Python社区教导我们“显式优于隐式”,只要显式代码有用。然而,那些else: pass对代码没有任何积极贡献。相反,它们只是毫无意义地占用两行。


3
您可以安全地删除这些代码,因为保留没有作用的代码是没有意义的:
if fields:
    for i in foo:
        if i == 'something':
            print "something"

3
一个 else pass 是无用代码,你应该删除它,因为它会给代码增加不必要的噪音,而且即使没有它,代码也会更清晰易懂。

3

我能想到很少几种情况下会用到pass,其中后两种只是暂时的桩代码:

  • 当您想要忽略一个可接受的异常时
  • 在调试时需要在函数末尾插入断点。
  • 作为一个实现需要推迟的函数的填充

我无法想象还有其他情况我会使用pass

编辑:

在一些情况下,当实现if-elif-else链式结构时,您可能会遇到一些共同的条件不需要执行任何操作——以及一些需要执行特定操作的罕见条件——为了提高执行效率,您可以在第一个if后面使用pass

if <some common condition>:
    pass
elif <rare condition>:
    <do something>
elif <another rare condition>:
    <do something else>
else:
   <do another stuff>

1
在这种情况下,使用pass更有效率的原因是什么? - Mr. Lance E Sloan
@LS,检查每个条件需要时间 - 很可能是纳秒级别的。通常这是可以忽略不计的 - 毕竟,你通常不会用Python编写实时实现 :)。然而,如果更罕见的条件涉及到调用一些慢速API,比如-数据库、Web服务,或者你经常进入这个链中 - 那么跳过整个链的优势可能是有益的。 - volcano
使用 not 反转逻辑会更简单,将前三行代码改为这两行:if not <某些常见条件>:if <罕见条件>: - Mr. Lance E Sloan

1
关于 else 的事情是它不仅仅是 if 语句的一部分;它还出现在 try 语句和 for 循环中。在这些地方,你并不看到 else 被使用(在这个上下文中)。
try:
    raw_input("say my name")
except:
    print "Heisenberg"
# Meh, this is not needed.
else:
    pass

如果我们正在循环某个东西并检查某些条件(使用if),那么else会增加不必要的行数。

这是一个用于查找文件夹的循环:
for path in pathlist
    if os.path.isdir(path):
        print "Found a folder, yay!"
        break
    else:
        continue

很明显,else语句在每次循环中都会被执行,这是没有意义的。正如PEP 8所暗示的那样,可以避免这种情况:

但最重要的是:知道何时不一致--有时样式指南并不适用。如果有疑问,请使用您的最佳判断。 查看其他示例并决定哪个看起来最好。不要犹豫 提问!
当应用该指南会使代码难以阅读时,即使对于习惯于遵循此PEP的人来说也是如此。


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