3

我在 Python 控制台上尝试了一些东西,我注意到无论函数名和 之间有多少空格(),Python 仍然设法调用该方法?

>>> def foo():
...   print 'hello'
...
>>> foo ()
hello
>>> foo                ()
hello

这怎么可能?这不应该引发某种异常吗?

4

4 回答 4

7

来自关于标记之间空格的词法分析文档:

除了在逻辑行的开头或在字符串文字中,空白字符空格、制表符和换页符可以互换使用来分隔标记。只有当它们的连接可以被解释为不同的标记(例如,ab 是一个标记,但 ab 是两个标记)时,两个标记之间才需要空格。

反转最后一句话,任何两个标记之间都允许有空格,只要它们不应被解释为没有空格的一个标记。使用多少空白没有限制。

前面的部分定义了逻辑线的组成部分,以上仅适用于逻辑线内。以下也是合法的:

result = (foo
                 ())

因为逻辑行通过括号扩展到换行符。

调用表达式是与前面不同的一系列标记;foo只是在全局命名空间中查找的名称,您可以从字典中查找对象,它可以从另一个调用中返回,等等。因此,该()部分是两个单独的标记和任意数量的空格围绕这些是允许的。

于 2013-05-16T14:41:50.927 回答
4

你应该明白

foo()

在 Python 中由两部分组成:foo().

第一个是在您的情况下可以在globals()字典中找到的名称,并且与之关联的值是一个函数对象。

表达式后面的左括号表示call应该进行操作。考虑例如:

def foo():
    print "Hello"

def bar():
    return foo

bar()()  # Will print "Hello"

所以他们要理解的关键点是()可以应用于它之前的任何表达式......例如mylist[i]()将获取第i-th 元素mylist并调用它不传递任何参数。

该语法还允许在表达式和(字符之间使用可选空格,这并不奇怪。请注意,您也可以例如写p . x为 mean p.x

于 2013-05-16T14:45:52.050 回答
3

Python 从 C 编程语言中汲取了许多线索。这当然是其中之一。考虑以下编译的事实:

int add(int a, int b)
{
    return a + b;
}

int main(int argc, char **argv)
{
    return add        (10, 11);
}

函数名和它的参数之间可以有任意数量的空格。

这也适用于其他语言。以 Ruby 为例,

def add(a, b)
  a + b
end

add       (10, 11)

当然你会收到警告,但它仍然有效,虽然我不知道如何,但我确信警告很容易被抑制。

于 2013-05-16T14:46:04.293 回答
1

Perfectly fine. Leading spaces or not, anything between a name of a symbol of sorts and rounded braces would probably change the name of the symbol (in this case a function definition) in question.

This is also common in various C-based languages, where padding spaces between the end of a function name and the parameter list can be done without issue.

于 2013-05-16T14:40:39.743 回答