在Python中,为什么裸函数对象有效代码?

时间:2012-11-28 17:11:34

标签: python

为什么以下内容有效?

#!/usr/bin/python
def spam():
   pass

spam

我知道函数是对象,但我认为上面的代码永远不会有用,而且总是错误的结果。为什么不在引用垃圾邮件功能对象的行上导致错误?

3 个答案:

答案 0 :(得分:7)

每个表达式都是有效的声明。使用局部变量(无论它指的是什么)是一个有效的表达式。由于后期绑定和动态性,您无法在编译时检测它是否引用了函数或其他内容(尽管在这种情况下您不需要知道,因为只引用本地从不做任何事情)。运行时检查非常昂贵,无法获得收益。

禁止表格<local variable>;。特别禁止这种情况是不一致的,需要额外的工作,并没有多少帮助恕我直言。我没有看到无法完成的技术原因,所以它可能归结为BDFL不想要特殊情况。

答案 1 :(得分:2)

首先,spamspam()当然是根本不同的陈述。如果您查看a = spama = 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

实际上是打印消息。在你的例子中给你一个错误会破坏这种情况的普遍性。