"if" 布尔值设置的条件:== 1,== True 还是忽略?

"if" condition for boolean settings: == 1, == True or just omit?

这是简单的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")

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

这取决于可能的值是什么。

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

规则很简单:编写测试时,写下你要测试的内容。

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

  • if spam::如果 spam 为真则通过。这意味着除 NoneFalse、数字零或空容器之外的任何内容。

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

  • if spam is True::只有当spam是特殊常量True时才通过。如果您想确保其他真实值失败,并且只有 True 有效,请使用 is。你很少需要这个。

  • if spam == True::如果 spam 是特殊常量 True 或等于它的某个对象,则通过。如果您不厌其烦地编写了一个 class,其 __eq__ 测试 True 或其他东西,那么您可能想要这个测试,但很难想象您为什么会这样做。

恰好1 == True。但是当你想测试数字 1 时写 == True ,或者当你想测试 True 而不是其他真值时写 == 1 ,对任何理解的人来说都是误导惯用语 Python,并且会让不习惯的人有点困惑,而且对任何人都没有好处。所以不要这样做。

当你想测试任何真实的东西时写其中任何一个不仅仅是误导,而且是错误的。

这在 PEP8, the official Python style guide's, "Programming Recommendations" section:

中有介绍
  • Don't compare boolean values to True or False using ==.

    Yes: if greeting:

    No: if greeting == True:

    Worse: if greeting is True:

在指南的其他部分,他们针对其他用例强调了这一点(例如,测试 empty/non-empty 集合应该 而不是 使用 len());除非特定值对您的逻辑 至关重要 ,否则请使用您正在测试的内容的隐式布尔性质(如果必须反转,则使用 not ),不要旋转您的带有比较的轮子最终在可读性方面几乎没有增加,增加了脆弱性,并减慢了代码的启动速度。

选择其他方法的唯一原因是,如果您期望存在其他不应该算作真实值的真实值。在这种情况下,translate_tabs_to_spaces 设置本质上是非常明显的布尔值,因此您几乎肯定希望以相同的方式处理任何真值;如果他们后来将设置重新设计为具有数值,其中 0 表示 "don't translate",任何正值表示每个选项卡值 space 的数量,隐式真实性评估将继续有效,但对于标准的四个 space 缩进,== 1== True 的测试会突然决定没有发生翻译。