Python 之禅“显式优于隐式”

sir*_*oup 6 python pep

我不确定这是一个自以为是的问题,还是我误解了“隐式”和“显式”在 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")
Run Code Online (Sandbox Code Playgroud)

我正在尝试遵循 Python 规则的禅宗,但我很想知道这是否适用于这种情况,还是我想多了?感谢我能得到的任何指导。

Mad*_*ist 8

这两个语句具有非常不同的语义。请记住,Python 是动态类型的。

对于 的情况a = []not alen(a) == 0是等价的。一个有效的替代方法可能是检查not len(a). 在某些情况下,您甚至可能希望通过执行a == [].

a可以是任何东西。例如,a = None。支票没问题not a,会回来的True。但len(a) == 0根本不会好。相反,您将获得TypeError: object of type 'NoneType' has no len(). 这是一个完全有效的选项,但这些if语句做的事情非常不同,你必须选择你想要的。

(几乎)所有东西__bool__在 Python 中都有一个方法,但不是所有东西都有__len__. 您必须根据情况决定使用哪一种。需要考虑的事情是:

  • 你已经验证过是否a是一个序列?
  • 你需要吗?
  • 你介意你的if语句在非序列上崩溃吗?
  • 你想处理其他虚假对象,就好像它们是空列表一样吗?

请记住,使代码看起来漂亮是正确完成工作的第二位。