"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")
更简洁易读。几乎没有必要将布尔值与另一个布尔值进行比较,并且仅当编程语言不支持布尔值时才应考虑使用整数 0
和 1
来表示布尔值。
这取决于可能的值是什么。
- 如果文件中必须包含
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
或等于它的某个对象,则通过。如果您不厌其烦地编写了一个 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
的测试会突然决定没有发生翻译。
这是简单的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")
更简洁易读。几乎没有必要将布尔值与另一个布尔值进行比较,并且仅当编程语言不支持布尔值时才应考虑使用整数 0
和 1
来表示布尔值。
这取决于可能的值是什么。
- 如果文件中必须包含
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
或等于它的某个对象,则通过。如果您不厌其烦地编写了一个 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
的测试会突然决定没有发生翻译。