为什么Python中没有显式的空性检查(例如'is Empty')
说“显性比隐性好”。然而,检查空虚的“pythonic”方法是使用隐式布尔值:为什么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() 使用一些不利于选择的变量
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