代码之家  ›  专栏  ›  技术社区  ›  Lesmana

为什么在python中没有显式的空检查(例如“is empty”)。

  •  22
  • Lesmana  · 技术社区  · 15 年前

    The Zen of Python 说“显性优于隐性”。然而,检查空虚的“蟒蛇式”方法是使用隐含的粗俗:

    if not some_sequence:
        some_sequence.fill_sequence()
    

    如果 some_sequence 是一个空序列,但如果是 None 0 .

    与理论上的显式空性检查相比:

    if some_sequence is Empty:
        some_sequence.fill_sequence()
    

    对于一些选择不当的变量名,用于检查空性的隐式booleanss会变得更加令人困惑:

    if saved:
        mess_up()
    

    比较:

    if saved is not Empty:
        mess_up()
    

    请参见: Python: What is the best way to check if a list is empty? “。我觉得讽刺的是,投票最多的答案声称含蓄的是蟒蛇。

    因此,是否有更高的原因导致没有明确的空性检查,例如 is Empty 在蟒蛇?

    5 回复  |  直到 10 年前
        1
  •  22
  •   Alex Martelli    15 年前

    多态性 if foo: if not foo: 这不是违反“隐式与显式”:它 明确地 将任务委托给被检查的对象,以了解它是真是假。这意味着什么(以及如何最好地检查它)显然是要做的,并且必须依赖于对象的类型,因此样式指南强制委托——让应用程序级代码傲慢地断言它比对象更清楚这是愚蠢的高度。

    此外, X is Whatever 总是,总是意味着x是 完全相同的对象 不管怎样。为 Empty 或任何其他特定值 Whatever 这将是荒谬的——很难想象会有一种更不和谐的方法。而“完全相同的对象”显然是可传递的——所以你再也不能有不同的空列表、空集合、空字典……恭喜你,你刚刚设计了一个完全不可用和无用的语言,每个空容器疯狂地“折叠”成一个空容器对象(想象一下当有人试图改变一个空容器时的乐趣…?!!)

        2
  •  14
  •   Lesmana    12 年前

    为什么没有 is Empty 一旦你明白了 is 操作员确实如此。

    python manual :

    算子 is not 对象标识测试: x is y 是真的 当且仅当 x y 是同一个对象。 x is not y 收益率 逆真值。

    那意味着 some_sequence is Empty 检查是否 some_sequence 与相同的对象 Empty . 这不符合你的建议。

    请考虑以下示例:

    >>> a = []
    >>> b = {}
    

    现在让我们假装有这个 是空的 用python构造:

    >>> a is Empty
    True
    >>> b is Empty
    True
    

    但自从 操作员进行身份检查,这意味着 a b 与相同 空的 . 那就意味着 是相同的,但它们不是:

    >>> a is b
    False
    

    所以回答你的问题“为什么没有 是空的 在蟒蛇?”因为 做身份检查。

    为了拥有 是空的 构造您必须 操作者指的是别的东西或创造出一些神奇的东西 空的 对象,它以某种方式检测空集合,然后与它们相同。

    而不是问为什么没有 是空的 您应该问为什么没有内置函数 isempty() 它调用特殊的方法 __isempty__() .

    因此,不要使用含蓄的粗俗:

    if saved:
      mess_up()
    

    我们有明确的空支票:

    if not isempty(saved):
      mess_up()
    

    哪一类的 saved 有一个 α-iSunTythIa() 方法实现了一些健全的逻辑。

    我发现这远比使用隐式布尔型检查空虚要好得多。

    当然,你可以很容易地定义自己的 iSimple() 功能:

    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)
    

    然后定义一个 α-iSunTythIa() 方法,它为所有集合类返回布尔值。

        3
  •  5
  •   Virgil Dupras    15 年前

    我同意有时候 if foo: 当我真的想告诉代码的读者我正在测试的代码是空的时,这对我来说并不明确。在这些情况下,我使用 if len(foo): . 足够明确。

    我100%同意亚历克斯W.R.T. is Empty 不讲理。

        4
  •  0
  •   Tony Veijalainen    15 年前

    考虑到Lisp使用()空列表或其符号nil多年来一直是错误的,t或任何不等于nil的东西都是正确的,但是通常情况下,对真理的计算已经产生了一些有用的结果,如果需要的话,这些结果不需要复制。还可以查看字符串的分区方法,其中中间结果非常好地工作,而非空的控件是真正的约定。

    我尽量避免使用len,因为在紧的循环中它是最贵的一倍。通常值得在程序逻辑中更新结果的长度值,而不是重新计算长度。

    对于我来说,我更希望python将false设置为()或[]而不是0,但事实就是这样。那么更自然的做法是使用非空的非[]。但现在()不是[]是真的,因此您可以使用:

    emptyset = set([])    
    if myset == emptyset:
    

    如果要显式显示空集合大小写(设置的不是myset([]))

    我自己也很喜欢 如果不是MySET 作为我的评论人。

    现在我想到,也许这是最接近明确的不空:

    if any(x in myset for x in myset): print "set is not empty"
    

    空的也会是:

    if not any(x in myset for x in myset): print "set is empty"
    
        5
  •  0
  •   Veky    10 年前

    那里 在python中对iterables的显式空性检查。这是拼写的。 not . 这里隐含着什么? 当iterable为空时给出true,当iterable为空时给出false。

    你到底反对什么?名字?正如其他人告诉你的,这肯定比 is Empty . 这并不是那么不合文法:考虑到在Python中事物通常是如何命名的,我们可以想象一个名为 widgets 令人惊讶的是,它包含一些小部件。然后,

    if not widgets:
    

    可以理解为“如果没有小部件…”。

    或者你反对这个长度?显式并不意味着冗长,这是两个不同的概念。巨蟒没有 addition 方法,它有 + 运算符,如果您知道要将其应用到的类型,则这是完全明确的。同样的事情 .