【问题标题】:Python style: if statements vs. boolean evaluationPython 风格:if 语句与布尔评估
【发布时间】:2010-06-10 05:05:31
【问题描述】:

Python 的设计理念之一是“应该有一种……显而易见的方法来做到这一点。” (PEP 20),但这并不总是正确的。我特别指的是(简单的)if 语句与布尔评估。考虑以下几点:

if words:
    self.words = words
else:
    self.words = {}

self.words = words or {}

在如此简单的情况下,从风格上讲,哪种更可取?对于更复杂的情况,人们会选择 if 语句以提高可读性,对吧?

【问题讨论】:

    标签: python coding-style if-statement


    【解决方案1】:

    “那里应该只有一个”可以永远是正确的;这是肯定的断言“只有一个”是不可能的——“应该”意味着一个目标,一个目标,而不是总是达到它的可能性(例如,对于数字 a 和 @987654322 @,禁止b + aa + b 将是如此荒谬,以至于在这种情况下不可能明智地存在“只有一种方式”)。

    在您的示例中,我同意 or 在足够简单的情况下更可取(四行来做可以在一个清晰易读的行中完成的事情是浪费垂直空间)但不适用于任何谓词显着的复杂性。确定什么具有“显着复杂性”当然是一个判断要求。

    【讨论】:

      【解决方案2】:

      在这种情况下,我会说“显式优于隐式”。

      当有人阅读您的代码时,他们可以做出一些假设。 他们可以假设“单词”可以是一个空的字典,也可以是一个包含数据的字典(当它是 None 时会忽略这种情况) 在这种情况下,他们可能会想优化您的代码。 如果在任何地方都没有说明您可以获得 None 值,他们甚至可能这样做是正确的。

      如果“单词”实际上可以是无,我会尝试通过以下方式澄清这一点:

      self.words = words
      if words is None:
          self.words = {}
      

      或者可能是一个“else”而不是先无条件赋值。 无论如何,通过这种方式,您可以记录下 None 是“单词”的预期值这一事实。

      【讨论】:

        【解决方案3】:

        (已编辑)
        好吧,在像下面这样的情况下,我投票支持条件表达式

        def somesuch(self, words=None):
            self.words = words or {}
            ...
        

        当然,如果您认为这样可以提高可读性(您可以这样大声朗读吗?),您可以尝试

        self.words = words if words else {}
        

        【讨论】:

        • 你是对的!事实上,整个问题的灵感来自于尝试使用类定义并发现我的所有实例共享相同的字典属性。
        • -1:您可能不想这样做(至少一般情况下不会)——可变的默认参数会让您感到惊讶。例如,请参阅stackoverflow.com/questions/1132941
        • @Scott Griffiths:呃,抱歉。我想我还没有遭受过这种痛苦,因为我没有想到。感谢您的网址。所以在python中没有可变的默认参数。保持-1,希望能帮助我记住教训
        • @Scott:您是否因为提到与问题无关的做法而否决了这个答案?你的意思是“你不想做默认参数”吗?
        • @xtoll:我最初有def somesuch(self, words=[]):,忘记了它是邪恶的。从那时起编辑了这篇文章
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-13
        • 1970-01-01
        • 2017-08-02
        • 1970-01-01
        • 1970-01-01
        • 2013-03-26
        相关资源
        最近更新 更多