【问题标题】:Function call syntax oddity函数调用语法奇怪
【发布时间】:2013-05-16 14:37:09
【问题描述】:

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

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

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

【问题讨论】:

  • 它是可能的,因为它是。它不会引发异常,因为它没有。你还需要什么解释? :-) 空格在这里并不重要。您也可以使用def foo () :,并带有任意数量的空格。
  • 我的意思是,它只是......我不知道......不知道这背后的理由是什么?语法规则呢?我的想法只是..到底是什么???但如果是这样的话,那就奇怪了。
  • 语法规则并不规定你在元素之间放置多少空格。 0 或 10 都是允许的。

标签: python syntax python-2.7 function-calls


【解决方案1】:

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

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

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

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

result = (foo
                 ())

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

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

【讨论】:

  • 谢谢,这就是我要搜索的内容。 +1
  • 是的,我知道用 ( ) 换行,但我没想到另一部分(函数名和 () 之间的空格会被接受)。
  • @BurhanKhalid:这说明了为什么样式指南如此重要和强大。 :-)
【解决方案2】:

你应该明白

foo()

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

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

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

def foo():
    print "Hello"

def bar():
    return foo

bar()()  # Will print "Hello"

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

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

【讨论】:

  • 表达式后面的左括号表示应该进行调用操作。 是我所缺少的。谢谢,我假设() 的组合是call
【解决方案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)

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

【讨论】:

    【解决方案4】:

    完全没问题。无论是否有前导空格,符号名称和圆括号之间的任何内容都可能会更改相关符号的名称(在本例中为函数定义)。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-27
      • 2011-03-19
      • 1970-01-01
      相关资源
      最近更新 更多