布尔设置的“如果”条件:== 1,==真还是忽略?

时间:2018-08-01 00:56:05

标签: python sublimetext sublime-text-plugin

这是简单的ST插件。注释行之间有区别吗?就个人而言,我认为它们的工作方式没有任何差异,只是外观上有所差异。

但是,某些插件开发人员更喜欢第二个版本(== 1),它对我来说看起来毫无用处和丑陋。也许有一些理由更喜欢它?

import sublime_plugin

class ExpandUnexpandTabsCommand(sublime_plugin.EventListener):
    def on_pre_save(self, view):

        # if view.settings().get("translate_tabs_to_spaces"):
        # if view.settings().get("translate_tabs_to_spaces") == 1:
        # if view.settings().get("translate_tabs_to_spaces") == True:
            view.run_command("expand_tabs")
        else:
            view.run_command("unexpand_tabs")

3 个答案:

答案 0 :(得分:4)

PEP8, the official Python style guide's, "Programming Recommendations" section对此进行了介绍:

  
      
  • 请勿使用==将布尔值与True或False进行比较。

         

    是:if greeting:

         

    否:if greeting == True:

         

    更糟糕:if greeting is True:

  •   

在指南的其他部分,他们在其他用例中强调了这一点(例如,对空/非空集合的测试应使用len());除非特定值对您的逻辑 critical 至关重要,否则请使用测试对象的隐式布尔性质(如果必须反转,请使用not),不要通过比较来旋转轮子最终只会增加可读性,增加脆弱性并降低代码启动速度。

首选其他方法的唯一原因是,如果您期望还有其他真实值,则不应将其视为真实值。在这种情况下,translate_tabs_to_spaces设置本质上是非常布尔型的,因此您几乎可以肯定希望以相同的方式处理任何真实值。如果他们后来将设置重新设计为具有数字值,其中0表示“不翻译”,任何正值表示每个选项卡值得的空格数,则隐式真实性评估将继续进行,但是对于标准的四个空格缩进,对于== 1== True的测试会突然决定没有翻译。

答案 1 :(得分:2)

这取决于可能的值。

  • 如果文件中必须包含01,则其他所有内容都是错误,并且您将其读取为int,则可能需要== 1
  • 如果文件可以有True或根本没有任何条目,并且您使用的是get(…)而不是[],那么只要没有{ {1}},那么您只想测试真实性。 (或者也许是None,但绝对不是Trueis not None。)

规则很简单:编写测试时,写出要测试的意思。

不同的测试意味着不同的事情:

  • == True:如果== 1是真实的,则通过。这意味着除了if spam:spam,数字零或空容器之外的任何内容。

  • None:如果False是数字if spam == 1:,则通过。

  • spam:仅当1是特殊常数if spam is True:时通过。如果要确保其他真实值失败,并且仅计数spam,请使用True。你很少想要这个。

  • True:如果is是特殊常数if spam == True:或等于它的某个对象,则通过。如果您不愿意编写一个类,该类的spam测试True或其他内容,则可能需要此测试,但是很难想象为什么会这样。

__eq__恰好是事实。但是,当您想测试数字True时写1 == True,或者当您想测试== True而不是其他真实值时写1,会误导任何理解的人惯用的Python,对没有这样做的人造成轻微的混淆,对任何人都没有好处。所以不要这样做。

而当您想测试任何真实性时写任何一个都不只是误导,这是错误的。

答案 2 :(得分:1)

if view.settings().get("translate_tabs_to_spaces")更简洁易读。几乎没有必要将布尔值与另一个布尔值进行比较,仅在编程语言不支持布尔值时才考虑使用01的整数来表示布尔值。