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 alen(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 代码选择。