Python 函数调用语法异常
我在Python控制台上尝试了一些东西,我注意到不管函数名和Python 函数调用语法异常,python,syntax,python-2.7,function-calls,Python,Syntax,Python 2.7,Function Calls,我在Python控制台上尝试了一些东西,我注意到不管函数名和()之间有多少空格,Python仍然能够调用该方法 >>> def foo(): ... print 'hello' ... >>> foo () hello >>> foo () hello 这怎么可能?这难道不应该引起某种例外吗?很好。不管是否使用前导空格,排序符号的名称和大括号之间的任何内容都可能会更改所讨论的符号名称(在本例中为函数定义)
()
之间有多少空格,Python仍然能够调用该方法
>>> def foo():
... print 'hello'
...
>>> foo ()
hello
>>> foo ()
hello
这怎么可能?这难道不应该引起某种例外吗?很好。不管是否使用前导空格,排序符号的名称和大括号之间的任何内容都可能会更改所讨论的符号名称(在本例中为函数定义) 这在各种基于C的语言中也很常见,在这些语言中,函数名结尾和参数列表之间的空格填充可以毫无问题地完成。来自关于令牌之间空格的文档: 除了在逻辑行的开头或字符串文本中,空白字符空格、制表符和formfeed可以互换地用于分隔标记。只有当两个标记的连接可以被解释为不同的标记时(例如,ab是一个标记,但a b是两个标记),两个标记之间才需要空白 颠倒最后一句话,任何两个标记之间都允许有空格,只要它们不应被解释为一个没有空格的标记。空白的使用没有限制 前面的部分定义了逻辑线的组成部分,以上内容仅适用于逻辑线内的内容。以下也是合法的:
result = (foo
())
因为逻辑行是通过括号跨换行扩展的
是一系列独立于前面的标记
foo
只是一个在全局命名空间中查找的名称,您可以从字典中查找对象,也可以从另一个调用中返回对象,等等。因此,()
部分是两个独立的标记,允许在这些标记中及其周围使用任意数量的空格。您应该理解这一点
foo()
在Python中,它由两部分组成:foo
和()
第一个是在globals()
字典中找到的名称,与之关联的值是一个函数对象
表达式后面的开括号表示应进行调用
操作。例如,考虑:
def foo():
print "Hello"
def bar():
return foo
bar()() # Will print "Hello"
所以他们需要理解的关键点是,()
可以应用于它前面的任何表达式。。。例如,mylist[i]()
将获取mylist
的i
-th元素,并调用它,不传递任何参数
语法还允许表达式和
(< /代码>字符,没有什么奇怪的。请注意,也可以写代码< > p x./c>,意思是<代码> P.x/Cuth>。 < Python从C编程语言中获取许多线索。这当然是其中之一。请考虑以下编译:
int add(int a, int b)
{
return a + b;
}
int main(int argc, char **argv)
{
return add (10, 11);
}
函数名和它的参数之间可以有任意数量的空格
这在其他语言中也是成立的。例如,考虑露比,
def add(a, b)
a + b
end
add (10, 11)
当然你会得到一个警告,但它仍然有效,尽管我不知道怎么做,但我确信这个警告很容易被抑制。这是可能的,因为它是。它不会因为没有引发异常而引发异常。你还需要什么解释?:-)空白在这里不重要。你可以使用def foo():
也可以,有任意数量的空格。我的意思是,它只是…我不知道…我不知道这背后的理由是什么?语法规则呢?我的想法是…怎么回事???但如果是这样的话,奇怪。语法规则不规定元素之间的空格数。0或10都是允许的。谢谢,这就是我试图搜索的内容。+1是的,我知道用()
包装行,但我从未想过会接受另一部分(函数名和()
之间的空格)。@BurhanKhalid:这说明了为什么样式指南如此重要和强大。:-)表达式后面的开括号表示应进行调用操作。是我错过的。谢谢,我假设()
的组合是call
。