这是简单的 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 风格指南 PEP8 的“编程建议”部分对此进行了介绍:
不要使用 == 将布尔值与 True 或 False 进行比较。
是的:
if greeting:
否:
if greeting == True:
更糟糕:
if greeting is True:
在指南的其他部分,他们在其他用例中强调了这一点(例如,测试空/非空集合应该不使用
len()
);除非某个特定值对您的逻辑至关重要,否则请使用您正在测试的内容的隐式布尔性质(如果必须反转,请使用 not
),不要进行最终增加很少的比较可读性、增加脆弱性并减慢代码启动速度。选择其他方法的唯一原因是,如果您期望
存在其他不应被视为真实的真实值。在这种情况下,translate_tabs_to_spaces
设置本质上是非常明显的布尔值,因此您几乎肯定希望以相同的方式处理任何真值;如果他们后来重新设计设置以具有数值,其中
0
表示“不翻译”,任何正值表示每个选项卡值得的空格数,隐式真实性评估将继续起作用,但对于标准的四个空格缩进,测试 == 1
或 == True
会突然决定没有发生翻译。如果文件中必须包含
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 的人,并且会让任何人感到困惑。谁不这样做,对任何人都没有好处。所以不要这样做。当你想测试任何真实的东西时,写下其中任何一个不仅是误导,而且是错误的。
if view.settings().get("translate_tabs_to_spaces")
更加简洁易读。几乎不需要将布尔值与另一个布尔值进行比较,并且仅当编程语言不支持布尔值时才应考虑使用整数
0
和 1
来表示布尔值。if x
x.__bool__()
方法来确定 x
的真实性。if x == True
x.__eq__(True)
方法将 x
与布尔值 True
进行比较。if x is True
x
是否为布尔值 True
,具体意味着 x
必须与 True
完全相同的对象(即,它共享相同的内存地址)。
x
的不同方面。