Python'Explicit is better than implicit'禅
Zen of Python 'Explicit is better than implicit'
我不确定这是一个自以为是的问题,还是我误解了 'implicit' 和 'explicit' 在 Python 的上下文中的真正含义。
a = []
# my understanding is that this is implicit
if not a:
print("list is empty")
# my understanding is that this is explicit
if len(a) == 0:
print("list is empty")
我正在尝试遵循 Python 规则的禅宗,但我很想知道这是否适用于这种情况,或者我是否想多了?感谢我能得到的任何指导。
这两个语句的语义截然不同。请记住 Python 是动态类型的。
对于a = []
的情况,not a
和len(a) == 0
是等价的。一个有效的替代方法可能是检查 not len(a)
。在某些情况下,您甚至可能想通过 a == []
.
来检查是否空虚和是否清爽
但是 a
可以是任何东西。例如,a = None
。检查 not a
没问题,并且会 return True
。但是 len(a) == 0
根本就不行。相反,你会得到 TypeError: object of type 'NoneType' has no len()
。这是一个完全有效的选项,但是 if
语句做的事情非常不同,您必须选择您想要的。
(几乎)所有东西都有 Python 中的 __bool__
方法,但并非所有东西都有 __len__
。您必须根据情况决定使用哪一个。需要考虑的事项是:
- 您是否已验证
a
是否为序列?
- 你需要吗?
- 如果您的
if
语句在 non-sequences 崩溃,您介意吗?
- 是否要像处理空列表一样处理其他虚假对象?
请记住,使代码看起来漂亮仅次于正确完成工作。
试着想:
if not a:
...
作为 shorthand 用于:
if len(a) == 0:
...
我认为这不是 Python 的“显式”优于“隐式”的禅宗法则的好例子。这样做主要是因为可读性。并不是说第二个不好,另一个好。只是第一个比较熟练。如果有人理解 Python 中列表的布尔性质,我想你会发现第一个在 Python.
中更具可读性和可读性
虽然这个帖子有一些时间,但我想提供一个观点。在动态语言中,我的偏好是始终描述变量的预期类型和 objective 以提供更多目的理解。然后使用语言知识尽可能简洁并增加可读性(在 python 中,空列表的布尔结果为 false)。因此代码:
lst_colours = []
if not lst_colours:
print("list is empty")
更好的表达意思是使用变量进行非常具体的检查。
lst_colours = []
b_is_list_empty = not lst_colours
if b_is_list_empty:
print("list is empty")
检查列表是否为空是在代码库中多次执行的常见操作。所以在单独的文件辅助函数库中更好。从而隔离公共检查,减少代码重复。
lst_colours = []
if b_is_list_empty(lst_colours):
print("list is empty")
def b_is_list_empty (lst):
......
最重要的是,尽可能多地添加意义,有一个商定的公司标准来选择如何处理简单的事情,比如变量命名和 implicit/explicit 代码选择。
我不确定这是一个自以为是的问题,还是我误解了 'implicit' 和 'explicit' 在 Python 的上下文中的真正含义。
a = []
# my understanding is that this is implicit
if not a:
print("list is empty")
# my understanding is that this is explicit
if len(a) == 0:
print("list is empty")
我正在尝试遵循 Python 规则的禅宗,但我很想知道这是否适用于这种情况,或者我是否想多了?感谢我能得到的任何指导。
这两个语句的语义截然不同。请记住 Python 是动态类型的。
对于a = []
的情况,not a
和len(a) == 0
是等价的。一个有效的替代方法可能是检查 not len(a)
。在某些情况下,您甚至可能想通过 a == []
.
但是 a
可以是任何东西。例如,a = None
。检查 not a
没问题,并且会 return True
。但是 len(a) == 0
根本就不行。相反,你会得到 TypeError: object of type 'NoneType' has no len()
。这是一个完全有效的选项,但是 if
语句做的事情非常不同,您必须选择您想要的。
(几乎)所有东西都有 Python 中的 __bool__
方法,但并非所有东西都有 __len__
。您必须根据情况决定使用哪一个。需要考虑的事项是:
- 您是否已验证
a
是否为序列? - 你需要吗?
- 如果您的
if
语句在 non-sequences 崩溃,您介意吗? - 是否要像处理空列表一样处理其他虚假对象?
请记住,使代码看起来漂亮仅次于正确完成工作。
试着想:
if not a:
...
作为 shorthand 用于:
if len(a) == 0:
...
我认为这不是 Python 的“显式”优于“隐式”的禅宗法则的好例子。这样做主要是因为可读性。并不是说第二个不好,另一个好。只是第一个比较熟练。如果有人理解 Python 中列表的布尔性质,我想你会发现第一个在 Python.
中更具可读性和可读性虽然这个帖子有一些时间,但我想提供一个观点。在动态语言中,我的偏好是始终描述变量的预期类型和 objective 以提供更多目的理解。然后使用语言知识尽可能简洁并增加可读性(在 python 中,空列表的布尔结果为 false)。因此代码:
lst_colours = []
if not lst_colours:
print("list is empty")
更好的表达意思是使用变量进行非常具体的检查。
lst_colours = []
b_is_list_empty = not lst_colours
if b_is_list_empty:
print("list is empty")
检查列表是否为空是在代码库中多次执行的常见操作。所以在单独的文件辅助函数库中更好。从而隔离公共检查,减少代码重复。
lst_colours = []
if b_is_list_empty(lst_colours):
print("list is empty")
def b_is_list_empty (lst):
......
最重要的是,尽可能多地添加意义,有一个商定的公司标准来选择如何处理简单的事情,比如变量命名和 implicit/explicit 代码选择。