这是简单的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")
答案 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)
这取决于可能的值。
0
或1
,则其他所有内容都是错误,并且您将其读取为int,则可能需要== 1
。True
或根本没有任何条目,并且您使用的是get(…)
而不是[]
,那么只要没有{ {1}},那么您只想测试真实性。 (或者也许是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
,会误导任何理解的人惯用的Python,对没有这样做的人造成轻微的混淆,对任何人都没有好处。所以不要这样做。
而当您想测试任何真实性时写任何一个都不只是误导,这是错误的。
答案 2 :(得分:1)
if view.settings().get("translate_tabs_to_spaces")
更简洁易读。几乎没有必要将布尔值与另一个布尔值进行比较,仅在编程语言不支持布尔值时才考虑使用0
和1
的整数来表示布尔值。