布尔设置的“if”条件:== 1,== True或只是省略?

问题描述 投票:0回答:4

这是简单的 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")
python sublimetext sublime-text-plugin
4个回答
4
投票

官方 Python 风格指南 PEP8 的“编程建议”部分对此进行了介绍

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

    是的:

    if greeting:

    否:

    if greeting == True:

    更糟糕:

    if greeting is True:

在指南的其他部分,他们在其他用例中强调了这一点(例如,测试空/非空集合应该使用

len()
);除非某个特定值对您的逻辑至关重要,否则请使用您正在测试的内容的隐式布尔性质(如果必须反转,请使用 not),不要进行最终增加很少的比较可读性、增加脆弱性并减慢代码启动速度。

选择其他方法的唯一原因是,如果您

期望

存在其他不应被视为真实的真实值。在这种情况下,translate_tabs_to_spaces设置本质上是非常明显的布尔值,因此您几乎肯定希望以相同的方式处理任何真值;如果他们后来重新设计设置以具有数值,其中

0
表示“不翻译”,任何正值表示每个选项卡值得的空格数,隐式真实性评估将继续起作用,但对于标准的四个空格缩进,测试
== 1
== True
会突然决定没有发生翻译。
    


3
投票

如果文件中必须包含
    0
  • 1
    ,其他任何内容都是错误,并且您将其作为 int 读取,那么您可能需要
    == 1
    如果文件可以有 
  • True
  • 或根本没有条目,并且您使用
    get(…)
    而不是
    []
    ,这样无论何时不是
    None
    ,您都可以返回
    True
    ,那么您只想测试真实性。 (或者也许
    is 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
,或者当你想测试
== 1
但不测试其他真值时,写
True
,会误导任何理解惯用 Python 的人,并且会让任何人感到困惑。谁不这样做,对任何人都没有好处。所以不要这样做。

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


1
投票
if view.settings().get("translate_tabs_to_spaces")

更加简洁易读。几乎不需要将布尔值与另一个布尔值进行比较,并且仅当编程语言不支持布尔值时才应考虑使用整数

0
1
来表示布尔值。
    


0
投票
    if x
  • :这将调用
    x.__bool__()
    方法来确定
    x
    的真实性。
  • if x == True
  • :这使用
    x.__eq__(True)
    方法将
    x
    与布尔值
    True
    进行比较。
  • if x is True
  • :这会检查
    x
    是否为布尔值
    True
    ,具体意味着
    x
    必须与
    True
    完全相同的对象(即,它共享相同的内存地址)。
    
    
  • 这三个条件可能会产生不同的结果,因为它们检查
x

的不同方面。

    

© www.soinside.com 2019 - 2024. All rights reserved.