函数调用语法奇怪

时间:2013-05-16 14:37:09

标签: python syntax python-2.7 function-calls

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

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

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

4 个答案:

答案 0 :(得分:7)

来自关于令牌之间空格的Lexical Analysis文档:

  

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

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

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

result = (foo
                 ())

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

call expression是一系列独立的令牌; foo只是在全局命名空间中查找的名称,您可以从字典中查找对象,可以从另一个调用返回等等。因此,()部分是允许使用两个单独的令牌和任何数量的空格。

答案 1 :(得分:4)

你应该明白

foo()
Python中的

由两部分组成:foo()

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

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

def foo():
    print "Hello"

def bar():
    return foo

bar()()  # Will print "Hello"

因此,他们要明白的一点是,()可以应用于其前面的任何表达式...例如mylist[i]()将获得i的{​​{1}}元素并且调用它不传递任何参数。

语法还允许表达式和mylist字符之间的可选空格,并且没有什么奇怪的。请注意,您也可以将(写为p . x

答案 2 :(得分: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)

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

答案 3 :(得分:1)

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

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