为什么在Python中没有明确的空白检查(例如`Empty')

Python的禅说:“显式比隐式更好”。 然而,检查空虚的“pythonic”方法是使用隐式布尔型:

if not some_sequence:
    some_sequence.fill_sequence()

如果some_sequence是一个空序列,但如果它是None0 ,则这将成立。

与理论显式空白检查相比较:

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测试对象的身份:当且仅当xy是同一个对象时, 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运算符确实进行身份检查,这意味着abEmpty相同。 这又意味着ab是相同的,但它们不是:

>>> 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。

链接地址: http://www.djcxy.com/p/22505.html

上一篇: Why is there no explicit emptyness check (for example `is Empty`) in Python

下一篇: Check if list is empty without using the `not` command