【问题标题】:Assigning string with boolean expression [duplicate]用布尔表达式分配字符串[重复]
【发布时间】:2016-08-01 17:26:47
【问题描述】:

我试图从别人的项目中理解这段代码。如果你想要上下文,它在这里:https://github.com/newsapps/beeswithmachineguns/blob/master/beeswithmachineguns/bees.py#L501

IS_PY2 只是一个布尔变量,True 如果 Python 主要版本是 2。 我知道一个非空字符串是True,但由于某种原因我不明白openmode 被分配了'w''wt' 而不是TrueFalse

openmode = IS_PY2 and 'w' or 'wt'
openkwargs = IS_PY2 and {} or {'encoding': 'utf-8', 'newline': ''}

有人能解释一下结果吗?

【问题讨论】:

    标签: python python-2.7


    【解决方案1】:

    andor 运算符只是简单地对其操作数执行布尔运算,给出布尔结果。他们给出的结果是总是他们的操作数之一。这些运算符从左到右求值,and 的优先级高于or,它们短路,这意味着它们会尽快停止求值。

    在纯布尔逻辑中,False and xFalse,无论 x 是什么,因此无需检查 x。 Python 表达式False and x 将给出False 的结果,它不会尝试评估x。因此False and some_function()不会调用some_function()

    同样,纯布尔逻辑中的True and xx 具有相同的真值,即如果xTrue,则True and xTrue,否则为False

    但是 Python and 运算符可以处理任意操作数。

    a and b 中,如果a 是假的,则不会评估b,结果将为a。如果a 是真的,那么b 被评估并成为结果。

    这是一个使用 Python 2 的简短演示:

    print False and 'boolean'
    print 0 and 'integer'
    print '' and 'string'
    print [] and 'list'
    print
    
    print True and 'boolean'
    print 7 and 'integer'
    print 'a' and 'string'
    print [42] and 'list'
    print
    
    print True and False
    print True and 0
    print True and ''
    print True and []
    print
    

    输出

    False
    0
    
    []
    
    boolean
    integer
    string
    list
    
    False
    0
    
    []
    

    0[] 之间的空行是打印空字符串的位置)。

    or 运算符也有类似的考虑。

    在纯布尔逻辑中,True or xTrue,不管x 是什么,如果or 表达式的第一部分是True-ish,我们不需要评估第二部分。而False or x 的真值为x

    print False or 'boolean'
    print 0 or 'integer'
    print '' or 'string'
    print [] or 'list'
    print
    
    print True or 'boolean'
    print 7 or 'integer'
    print 'a' or 'string'
    print [42] or 'list'
    print
    
    print False or False
    print False or 0
    print False or ''
    print False or []
    print
    

    输出

    boolean
    integer
    string
    list
    
    True
    7
    a
    [42]
    
    False
    0
    
    []
    

    正如我之前所说,这些运算符是从左到右计算的,如果需要,我们可以将它们链接起来。以下是“经典”案例:

    print True and 'yes' or 'no'
    print False and 'yes' or 'no'
    

    这些语句等价于

    print (True and 'yes') or 'no'
    print (False and 'yes') or 'no'
    

    输出

    yes
    no
    

    这种结构在 Python 的早期版本中很常见。这些天来,看到 if 表达式的情况要普遍得多

    print 'yes' if True else 'no'
    print 'yes' if False else 'no'
    

    这通常被认为比使用andor 的三元表达式更具可读性。此外,如果b 是假的,a and b or c等同于b if a else c

    但是,了解这个三元 and ... or 的工作原理仍然很重要,尤其是在您需要阅读或维护旧代码时。一些老的 Pythonistas 仍然更喜欢 and ... or 形式,因为它稍微短一些,即使当你不理解它是如何工作的时候它有点令人困惑。 :)

    【讨论】:

      【解决方案2】:

      三元布尔表达式的作用如下:

      >>> 2 and 3 or 4
      3
      >>> 0 and 3 or 4
      4
      

      所以,这个表达式:

      openmode = IS_PY2 and 'w' or 'wt'
      

      成为 Python 2:

      openmode = True and 'w' or 'wt'
      

      相当于

      openmode = 'w' or 'wt'
      

      所以,我给了w

      在 Python 3 下,IS_PY2 为 False,给出:

      openmode = False and 'w' or 'wt'
      

      相当于

      openmode = False or 'wt'
      

      wt


      所有这些都是为了明确指定 openmode 用于文本文件,而不是二进制文件,这在 Python2 中由 w 和 Python3 中的 wt 指示。

      虽然 Python3 的 t 模式是默认模式,但这不是必需的。

      this answer about wt mode


      最后,我认为以下内容更具可读性:

      openmode = 'w' if IS_PY2 else 'wt'
      

      还有这个,要简单得多:

      openmode = 'w'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多