Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Python中没有显式的空性检查(例如'is Empty')_Python - Fatal编程技术网

为什么Python中没有显式的空性检查(例如'is Empty')

为什么Python中没有显式的空性检查(例如'is Empty'),python,Python,说“显性比隐性好”。然而,检查空虚的“pythonic”方法是使用隐式布尔值: if not some_sequence: some_sequence.fill_sequence() if saved: mess_up() 如果some_sequence是空序列,但如果None或0也是空序列,则这将是正确的 与理论显式空性检查相比: if some_sequence is Empty: some_sequence.fill_sequence() 使用一些不利于选择的变量

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

if not some_sequence:
    some_sequence.fill_sequence()
if saved:
  mess_up()
如果
some_sequence
是空序列,但如果
None
0
也是空序列,则这将是正确的

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

if some_sequence is Empty:
    some_sequence.fill_sequence()
使用一些不利于选择的变量名,检查空值的隐式布尔值变得更加混乱:

if saved:
    mess_up()
与之相比:

if saved is not Empty:
    mess_up()
另见:“。我发现最具讽刺意味的是,大多数投票的答案声称隐式是蟒蛇式的


那么,为什么没有显式空性检查,比如Python中的
是空的
中的多态性,如果foo:
如果不是foo:
就不违反“隐式vs显式”:它显式地委托给被检查的对象,让对象知道它是真是假。这意味着什么(以及如何最好地检查它)显然取决于并且必须取决于对象的类型,因此样式指南要求委托——让应用程序级代码傲慢地断言它比对象知道得更多将是愚蠢的高度


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

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


我100%同意Alex w.r.t
是空的
是非音速的。

考虑到Lisp多年来一直使用()空列表或其符号NIL作为假,t或任何不是NIL的东西作为真,但通常真理的计算已经产生了一些有用的结果,如果需要的话,不需要重现。还可以查看字符串的分区方法,其中中间结果非常好地工作,而非空控件是真正的约定

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

对我来说,我更希望Python使用False作为()或[],而不是0,但事实就是这样。那么使用not[]作为notempty就更自然了。但是现在()不是[]是真的,因此您可以使用:

emptyset = set([])    
if myset == emptyset:
如果您想明确空集的大小写(而不是myset是set([]))

我本人非常喜欢如果不是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"

一旦您了解了
是什么
操作符,那么没有
是空的
的原因就非常简单了

从:

运算符
不为
测试对象标识:
x为y
为真 当且仅当
x
y
是同一对象<代码>x不是y
生成 逆真值

这意味着
some\u sequence是空的
检查
some\u sequence
是否与
Empty
是同一对象。那不能按你建议的方式工作

考虑以下示例:

>>> a = []
>>> b = {}
现在,让我们假设python中的
是空的
构造:

>>> a is Empty
True
>>> b is Empty
True
但是由于
操作员进行身份检查,这意味着
a
b
相同。这反过来必须意味着
a
b
是相同的,但它们不是:

>>> a is b
False
因此,要回答您的问题“为什么python中没有
is Empty
”:因为
is
进行身份检查

为了使
是空的
构造,您必须对
操作符进行黑客攻击,使其具有其他含义,或者创建一些神奇的
空的
对象,该对象以某种方式检测空集合,然后与它们相同

与其问为什么没有
is Empty
,不如问为什么没有调用特殊方法
\uu isempty()
的内置函数
isempty()

因此,不要使用隐式布尔值:

if not some_sequence:
    some_sequence.fill_sequence()
if saved:
  mess_up()
我们有明确的空支票:

if not isempty(saved):
  mess_up()
其中,保存的
类有一个
\uu isempty\uu()
方法,该方法被实现为某种正常的逻辑

我发现这比使用隐式布尔来检查空性要好得多

当然,您可以轻松定义自己的
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)
然后定义一个
\uu isempty\uu()
方法,该方法为所有集合类返回一个布尔值。

Python中有一个显式的iterables空性检查。它的拼写是
而不是
。这是什么意思
not
在iterable为空时给出True,在iterable为非空时给出False

你到底反对什么?名字?正如其他人告诉您的,它肯定比
为空
要好。而且它也不是那么不合语法:考虑到Python中通常是如何命名的,我们可以想象一个名为
widgets
的序列,其中意外地包含一些小部件。那么

if not widgets:
可以理解为“如果没有小部件…”

或者你反对长度?显式并不意味着冗长,这是两个不同的概念。Python没有
添加
meth