代码之家  ›  专栏  ›  技术社区  ›  kriss

比较布尔值为真或假的奇怪PEP8建议

  •  13
  • kriss  · 技术社区  · 14 年前

    PEP8

    • 不要使用将布尔值与True或False进行比较 ==

      Yes:   if greeting:
      No:    if greeting == True:
      Worse: if greeting is True:
      

    当布尔值为 True ,但在检查 False

    如果我想知道可变问候语是否为假,为什么不写:

        if greeting == False:
    

    if not greeting: 这将有一个非常不同的含义,上述声明。如果问候不是什么呢?如果是空字符串呢?这个PEP8建议是否意味着存储布尔值的变量应该只包含True或False,并且这些变量不应该避免包含True或False?

    顺便问一下,有人知道为什么 if greeting is True: 更糟的是 if greeting == True: if greeting is False: 更糟的是 if greeting == False:

    5 回复  |  直到 4 年前
        1
  •  2
  •   Walter    14 年前

    按照我的理解,政治公众人物的建议意味着,如果你知道可以合理地确定 foo (通常是这种情况),那么测试显式错误值是多余的,并且会降低可读性。例如,在 foo = [i for i in range(10) if i == x] ,您可以相当确定 可以拥有的是 [] (假设没有引发异常)。在这种情况下,使用 foo == [] not foo

    另一方面 foo==[] foo == False 有时更有价值 应该 然后用(IMHO)代替 . 这取决于,具体地说,你想沟通什么。事实上 不是foo " 错误值?”,鉴于 foo==假 " 具有与 False

    政治公众人物说它所包含的一切 . 规则也有例外,这一条也不例外。

        2
  •  17
  •   paxdiablo    11 年前

    greeting 作为一个名词和一个动词(“我在问候”而不是“这是问候”)。

    Guido的一个关键见解是,代码的阅读频率远高于编写频率。这里提供的指南旨在提高代码的可读性。

    为此,代码应该尽可能类似于书面或口头的单词。是吗 "If I am annoying you is true, let me know" 在现实生活中,你只是说 "If I am annoying you, let me know"

    这就是为什么你倾向于看到布尔变量 isOpen hasBeenProcessed

    你不应该做这样的事情:

    if (isOpen == True)
    

    或:

    if (customerDead == False)
    

    因为变量名中已经有一个布尔值。所有的平等都给了你 另一个 布尔值,调用reduction ad absurdum,您将在哪里停止?

    if (isComplete == True) ...
    if ((isComplete == True) == True) ...
    if (((isComplete == True) == True) == True) ...
    if ((((isComplete == True) == True) == True) == True)...
    
        3
  •  5
  •   Glenn Maynard    14 年前

    这是鸭子打字的一部分。在Python中,您通常不希望将接受的内容限制为特定的类,而是限制为公开适当API的对象。例如,我可以这样做:

    class MyProperty(object):
        """
        A file-backed boolean property.
        """
        def __init__(self, filename):
            self.value = open(filename).read()
        def __nonzero__(self):
            return self.value != "0"
        def save_to_disk(self):
            # ... and so on
            pass
    
    def func(enabled):
        if not enabled:
            return
        # ...
    
    enable_feature = MyProperty("enable_feature")
    func(enable_feature)
    

    if enabled == False 会导致这不起作用。

    假是 只有 isinstance .

        4
  •  5
  •   Community Egal    7 年前

    不比较真理的最简单理由 == != 比较起来似乎是这样的:

    0 is False # Result: False
    0 == False # Result: True; 0 evaluates comparatively to False
    
    1 is True  # Result: False  
    1 == True  # Result: True; 1 evaluates comparatively to True
    

    is 检查传递的值是否为 确切地 True False ,而不是是否 评估 .

    此行为允许:

    if var is False:
       # False (bool) case
    elif var is None:
       # None case
    elif var == 0:
       # integer 0 case
    

    鉴于

    if var == False:
        # catches False & 0 case; but not None case, empty string case, etc.
    

    这似乎有悖常理——这就是为什么我希望PEP8说“不要这么做”。

    here 使用 对于 身份 == 对于 平等

    你只想用 if var is True 当你需要布尔值时 真的 ,但要拒绝 1 , 'some string' 等等。

    is True ,它 可以 表示设计问题。无论如何,你可能应该评论一下你需要的“为什么” 确切地 真的 如果你真的用过 .

        5
  •  1
  •   Alexandre Huat    5 年前

    如果我写信 if not greeting: 这将有一个非常不同的含义,上述声明。

    的确, not greeting greeting == False 问候语==假

    不要比较 布尔型 使用将值设置为True或False==

    也不是 None 所以使用 问候语==假 如果合适的话 greeting 可以是非布尔值。


    有人在您的问题下面发表了评论:

    不是的。这里是一个用例:你有一个病人数据库,其中有一个字段说明病人是否死于自杀。假设我们有课 Patient suicide . 自杀 可能有三个值:

    • True
    • False 意思是“不,我们知道他死于别的什么”
    • 意思是“我们实际上不知道”。

    # load database
    ...
    
    # filter patients
    database = [patient for patient in database if patient.suicide == False]  # if greeting == False:
    
    # study database
    ...
    

    量化宽松政策。这是数据科学中的一个典型案例。价值 意思是你什么都不知道。

        6
  •  0
  •   Björn Pollex    14 年前

    IsName ,所以在你的情况下 IsGreeting . 这使得支票上写着 if IsGreeting / if not IsGreeting

    你描述的模棱两可 if not 是在布尔比较中使用非布尔类型的结果。这通常应该避免,因为它非常混乱。