我在 Python 控制台上尝试了一些东西,我注意到无论函数名和 之间有多少空格()
,Python 仍然设法调用该方法?
>>> def foo():
... print 'hello'
...
>>> foo ()
hello
>>> foo ()
hello
这怎么可能?这不应该引发某种异常吗?
我在 Python 控制台上尝试了一些东西,我注意到无论函数名和 之间有多少空格()
,Python 仍然设法调用该方法?
>>> def foo():
... print 'hello'
...
>>> foo ()
hello
>>> foo ()
hello
这怎么可能?这不应该引发某种异常吗?
来自关于标记之间空格的词法分析文档:
除了在逻辑行的开头或在字符串文字中,空白字符空格、制表符和换页符可以互换使用来分隔标记。只有当它们的连接可以被解释为不同的标记(例如,ab 是一个标记,但 ab 是两个标记)时,两个标记之间才需要空格。
反转最后一句话,任何两个标记之间都允许有空格,只要它们不应被解释为没有空格的一个标记。使用多少空白没有限制。
前面的部分定义了逻辑线的组成部分,以上仅适用于逻辑线内。以下也是合法的:
result = (foo
())
因为逻辑行通过括号扩展到换行符。
调用表达式是与前面不同的一系列标记;foo
只是在全局命名空间中查找的名称,您可以从字典中查找对象,它可以从另一个调用中返回,等等。因此,该()
部分是两个单独的标记和任意数量的空格围绕这些是允许的。
你应该明白
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
。
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)
当然你会收到警告,但它仍然有效,虽然我不知道如何,但我确信警告很容易被抑制。
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.