为什么在Python中没有明确的空白检查(例如`Empty')
Python的禅说:“显式比隐式更好”。 然而,检查空虚的“pythonic”方法是使用隐式布尔型:
if not some_sequence:
some_sequence.fill_sequence()
如果some_sequence
是一个空序列,但如果它是None
或0
,则这将成立。
与理论显式空白检查相比较:
if some_sequence is Empty:
some_sequence.fill_sequence()
用一些不愉快的选择变量名称来检查空虚的隐含的boolea变得更加混乱:
if saved:
mess_up()
与之比较:
if saved is not Empty:
mess_up()
另请参阅:“Python:检查列表是否为空的最佳方法是什么?”。 我觉得有讽刺意味的是,最被投票的答案认为隐含的是pythonic。
那么为什么没有明确的空白检查有更高的理由,比如Python中is Empty
?
if foo:
多态if foo:
if not foo:
并不违反“隐式vs显式”:它明确地委托被检查的对象知道它是真还是假。 这意味着什么(以及如何最好地检查它)显然确实并且必须依赖于对象的类型,所以风格指南授权委派 - 具有应用程序级代码的人傲慢地断言它比对象更能理解愚蠢的高度。
而且, X is Whatever
总是表示X总是与Whatever 完全相同的对象 。 制作一个完全独特的例外Empty
的或任何其他特定值Whatever
是荒谬的-很难想象一个更unPythonic方法。 和“完全相同的对象”显然是传递性的 - 所以你永远不能再有明确的空列表,空集,空字典......恭喜你,你设计了一个完全不可用和无用的语言,每个空容器疯狂地“崩溃”到一个空的容器对象(想象有人试图改变一个空容器的乐趣......?!)。
之所以没有is Empty
,一旦你明白什么是出奇简单is
操作者。
从python手册:
运算符is
is not
测试对象的身份:当且仅当x
和y
是同一个对象时, x is y
是真的。 x is not y
产生逆真值。
这意味着some_sequence is Empty
检查some_sequence
是否与Empty
相同。 这不能按照你的建议。
考虑下面的例子:
>>> a = []
>>> b = {}
现在让我们假装这is Empty
Python中的is Empty
构造:
>>> a is Empty
True
>>> b is Empty
True
但是由于is
运算符确实进行身份检查,这意味着a
和b
与Empty
相同。 这又意味着a
和b
是相同的,但它们不是:
>>> a is b
False
因此,要回答你的问题“为什么没有在Python中is Empty
的?”:因为is
做身份检查。
为了拥有is Empty
结构,你必须破解is
运算符来表示别的东西,或者创建一些神奇的Empty
对象,它以某种方式检测空集合,然后与它们相同。
而不是问为什么没有is Empty
你应该问为什么没有内建函数isempty()
调用特殊方法__isempty__()
。
因此,而不是使用隐式布尔型:
if saved:
mess_up()
我们有明确的空白检查:
if not isempty(saved):
mess_up()
其中saved
的类有一个__isempty__()
方法实现了一些理智的逻辑。
我发现这远比使用隐式布尔值来进行空值检查要好得多。
当然,您可以轻松定义自己的isempty()
函数:
def isempty(collection):
try:
return collection.__isempty__()
except AttributeError:
# fall back to implicit booleaness but check for common pitfalls
if collection is None:
raise TypeError('None cannot be empty')
if collection is False:
raise TypeError('False cannot be empty')
if collection == 0:
raise TypeError('0 cannot be empty')
return bool(collection)
然后定义一个__isempty__()
方法,它将为所有集合类返回一个布尔值。
我同意有时if foo:
对我来说并不明确,当我真的想告诉读者代码它是我正在测试的空虚。 在这些情况下,我使用if len(foo):
显而易见。
我100%同意亚历克斯Wrt is Empty
的unpythonic。
上一篇: Why is there no explicit emptyness check (for example `is Empty`) in Python