【问题标题】:Using pass on a non necessary else statement对非必要的 else 语句使用 pass
【发布时间】:2013-12-31 16:08:10
【问题描述】:

根据 PEP8 文档,我找不到任何关于是否应该在代码中使用 pass 的参考资料。根据下面的示例,我应该保留那些else 还是可以删除它们?到目前为止,我保留它的主要原因是基于“显式胜于隐式”的口头禅。

if fields:
    for i in foo:
        if i == 'something':
            print "something"
        else:
            pass
else:
    pass

【问题讨论】:

  • 不要混淆显式和冗余。
  • 或者你做for i in filter(lambda i: i == 'something', foo),那么你甚至不需要考虑else
  • 一般来说,不管是什么编程语言,什么都不做的代码都应该被删除。

标签: python pep8


【解决方案1】:

是的,您可以/应该删除它们,因为它们什么都不做。

只要显式代码做一些有用的事情,Python 社区就会教导“显式优于隐式”。然而,那些else: pass 对代码没有任何积极作用。相反,他们所做的只是毫无意义地每人消耗两行代码。

【讨论】:

    【解决方案2】:

    您可以安全地删除它们,因为保留无用的代码是没有意义的:

    if fields:
        for i in foo:
            if i == 'something':
                print "something"
    

    【讨论】:

      【解决方案3】:

      else pass 是死代码,你应该删除它,因为它会给代码增加不必要的噪音,无论如何,如果没有它,代码会更清晰,更容易理解。

      【讨论】:

        【解决方案4】:

        我能想到 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>
        

        【讨论】:

        • 在这种情况下使用pass 效率如何?
        • @LS,检查每个条件都需要时间——很可能是纳秒。通常它可以忽略不计 - 毕竟,您通常不会在 Python 中编写 RT 实现 :)。但是,如果更罕见的情况需要转向一些缓慢的 API,例如- DB、Web 服务,或者你经常进入链条 - 那么跳过整个链条的优势可能是有益的。
        • not否定逻辑会更简单,将前三行改为这两行:if not &lt;some common condition&gt;:if &lt;rare condition&gt;:
        【解决方案5】:

        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 的代码的人也是如此。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-03-31
          • 2019-03-18
          • 2018-02-19
          • 2015-02-03
          • 2016-11-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多