3

为什么以下有效?

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

spam

我知道函数是对象,但我认为像上面这样的代码从来没有用过,而且总是错误的结果。为什么它不会导致引用垃圾邮件函数对象的行出现错误?

4

3 回答 3

7

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

剩下的就是禁止语句的形式<local variable>;。明确禁止这种情况是不一致的,需要额外的工作,并且对恕我直言没有太大帮助。我看不出它无法完成的技术原因,所以它可能归结为 BDFL 不想要一个特殊情况。

于 2012-11-28T17:18:17.720 回答
2

首先,spam当然spam()是根本不同的说法。如果您查看 和 之间的区别,这一点就会变得很a = spam清楚a = spam()。第一个将函数存储在 variablea中,第二个存储在那个时刻发生的一次函数调用的返回值。两者都很有用,但操作不同。

只是提到像 in 这样的功能spam并没有做有用的事情,不。但是在 python 中,仅仅声明值是不被禁止的。根据您的论证,单个语句4也应该是非法的,任何文字值也是如此。这实际上会禁止在任何地方使用 pydoc 字符串,因为它们只是提到了其他无用的值(从执行的角度来看)。

所以我认为可以禁止使用这样的裸值,但事实并非如此,现在它甚至有使用。

于 2012-11-28T17:24:06.080 回答
2

在一般情况下,引用裸表达式可能会产生副作用。编码:

class Nugget(object):
    @property
    def spam(self):
        print "does merely referencing a property invoke it?"

n = Nugget()
n.spam           # no explicit invocation

实际上打印消息。在您的示例案例中给您一个错误会破坏这种案例的一般性。

于 2012-11-28T17:32:04.867 回答