为什么以下内容有效?
#!/usr/bin/python
def spam():
pass
spam
我知道函数是对象,但我认为上面的代码永远不会有用,而且总是错误的结果。为什么不在引用垃圾邮件功能对象的行上导致错误?
答案 0 :(得分:7)
每个表达式都是有效的声明。使用局部变量(无论它指的是什么)是一个有效的表达式。由于后期绑定和动态性,您无法在编译时检测它是否引用了函数或其他内容(尽管在这种情况下您不需要知道,因为只引用本地从不做任何事情)。运行时检查非常昂贵,无法获得收益。
禁止表格<local variable>;
。特别禁止这种情况是不一致的,需要额外的工作,并没有多少帮助恕我直言。我没有看到无法完成的技术原因,所以它可能归结为BDFL不想要特殊情况。
答案 1 :(得分:2)
首先,spam
和spam()
当然是根本不同的陈述。如果您查看a = spam
和a = spam()
之间的区别,就会清楚这一点。第一个将函数存储在变量a
中,第二个存储在那个时刻发生的函数的一次调用的返回值。两者都是有用但不同的操作。
只是提到像spam
这样的功能并没有做有用的事情,没有。但是在python中不禁止声明值。在你的论证之后,单个陈述4
也应该是非法的,就像任何小的价值一样。这实际上会在任何地方使用pydoc字符串进行伪装,因为它们只是提到了一个无用的值(从执行的角度来看)。
所以我认为可能禁止使用这些裸值,但事实并非如此,现在它甚至可以使用。
答案 2 :(得分:2)
在一般情况下,引用裸表达式可能会产生副作用。代码:
class Nugget(object):
@property
def spam(self):
print "does merely referencing a property invoke it?"
n = Nugget()
n.spam # no explicit invocation
实际上是打印消息。在你的例子中给你一个错误会破坏这种情况的普遍性。