繁体   English   中英

函数调用语法奇怪

[英]Function call syntax oddity

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

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

怎么可能? 不应该引发某种例外吗?

从关于标记之间空格的Lexical Analysis文档:

除了在逻辑行的开头或字符串文字中,空白字符空格,制表符和换页符可以互换使用以分隔标记。 仅当两个令牌的串联可以被解释为不同的令牌时才需要空格(例如,ab是一个令牌,但是ab是两个令牌)。

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

前面的部分定义了包含逻辑行的内容,上面仅适用于逻辑行。 以下是合法的:

result = (foo
                 ())

因为逻辑线通过括号跨越换行符延伸。

调用表达式是一个独立的令牌系列,从前面开始; foo只是一个在全局命名空间中查找的名称,你可以从字典中查找对象,它可以从另一个调用返回等等。因此, ()部分是两个单独的标记和任意数量的允许在这些内部和周围的空白。

你应该明白这一点

foo()

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

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

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

def foo():
    print "Hello"

def bar():
    return foo

bar()()  # Will print "Hello"

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

语法还允许表达和之间可选空间(人物并没有什么奇怪的了。请注意,你也可以例如写p . x是指px

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)

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

非常好。 是否有前导空格,在各种符号名称和圆括号之间的任何内容都可能会更改有问题的符号名称(在本例中为函数定义)。

这在各种基于C的语言中也很常见,其中函数名称末尾和参数列表之间的填充空格可以毫无问题地完成。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM