函数调用中的Python理解(PEP 448)

函数调用中的Python理解(PEP 448),python,python-3.x,language-lawyer,Python,Python 3.x,Language Lawyer,(这些都在Python 3.5.2上) 在下面,我看到: 函数调用中的无包装理解,例如f(其中x代表x),已经有效 这很有趣。如果我定义以下函数: def f(a, b, c): return a + b + c 然后,这个措辞让我认为f(在[1,2,3]中的物对物]==6。但实际上,我得到: >>> f(thing for thing in [1, 2, 3]) TypeError: f() missing 2 required positional argumen

(这些都在Python 3.5.2上)

在下面,我看到:

函数调用中的无包装理解,例如
f(其中x代表x)
,已经有效

这很有趣。如果我定义以下函数:

def f(a, b, c):
    return a + b + c
然后,这个措辞让我认为
f(在[1,2,3]中的物对物]==6
。但实际上,我得到:

>>> f(thing for thing in [1, 2, 3])
TypeError: f() missing 2 required positional arguments: 'b' and 'c'
i、 e.整个生成器表达式作为
a
传递


那么PEP 448中的这句话是什么意思?是否可以将生成器表达式作为参数传递?

此语句仅表示在pre-PEPworld
f(其中x代表x)
中,生成器表达式已经有效,并作为第一个函数参数传递

要使示例正常工作,您需要显式地解包生成器,如PEP示例所示

f(*(thing for thing in [1, 2, 3]))  # returns 6

此语句仅表示在pre-PEPworld
f(其中x代表x)
中已有效,并将生成器表达式作为第一个函数参数传递

要使示例正常工作,您需要显式地解包生成器,如PEP示例所示

f(*(thing for thing in [1, 2, 3]))  # returns 6

所发生的事情是,在第
f行(在[1,2,3]中是物对物的)
中,您只传递第一个参数,它是一个生成器。缺少参数
b
c

此外,请检查政治公众人物的以下部分:

然而,目前还不清楚这是不是最好的行为,或者这是不是最好的行为 应该解压缩到调用f的参数中。既然这是 很可能会让人困惑,而且效用很小,但事实并非如此 包括在本政治公众人物中。相反,这些将抛出一个SyntaxError和 应使用带有明确括号的理解


所发生的事情是,在第
f行(在[1,2,3]中是物对物的)
中,您只传递第一个参数,它是一个生成器。缺少参数
b
c

此外,请检查政治公众人物的以下部分:

然而,目前还不清楚这是不是最好的行为,或者这是不是最好的行为 应该解压缩到调用f的参数中。既然这是 很可能会让人困惑,而且效用很小,但事实并非如此 包括在本政治公众人物中。相反,这些将抛出一个SyntaxError和 应使用带有明确括号的理解

实际上
f(其中x代表x)
不是PEP 448引入的新功能,而是由。注意,并非PEP 448中讨论的所有功能都在Python 3.5中实现。问题中提到的措施未得到实施:

因为这可能会让人困惑,而且只起到很小的作用 实用程序,不包括在本政治公众人物中。相反,这些将抛出一个 应使用带有明确括号的语法错误和理解 相反

实际上
f(其中x代表x)
不是PEP 448引入的新功能,而是由。注意,并非PEP 448中讨论的所有功能都在Python 3.5中实现。问题中提到的措施未得到实施:

因为这可能会让人困惑,而且只起到很小的作用 实用程序,不包括在本政治公众人物中。相反,这些将抛出一个 应使用带有明确括号的语法错误和理解 相反


Python允许您将单个生成器表达式传递给正在调用的函数,而不需要额外的括号。例如:

foo(x for x in range(10))
主要相当于:

genexp = (x for x in range(10)) # parentheses are necessary here
foo(genexp)
如果传递给函数调用的还有其他参数(例如,
foo(w,(x表示范围(10))中的x),y,z)
,其中第二个参数是
x
的生成器表达式,则在定义生成器表达式时仍然需要括号


政治公众人物顺便提到,在这种情况下,解包语法的进一步扩展可能会令人困惑。如果一种新的生成器表达式
(*x代表嵌套中的x)
是合法的(它不是最终政治公众人物的一部分,但考虑了一段时间),那么
foo(*x代表嵌套中的x)
应该如何工作?它是否等同于
foo((*x表示嵌套中的x))
(使用单个生成器表达式调用,其中包括新的“展平”
*
),或者它的意思是
foo(*(x表示嵌套中的x))
(现在是合法的)?

Python允许您将单个生成器表达式传递给正在调用的函数,而不需要额外的括号。例如:

foo(x for x in range(10))
主要相当于:

genexp = (x for x in range(10)) # parentheses are necessary here
foo(genexp)
如果传递给函数调用的还有其他参数(例如,
foo(w,(x表示范围(10))中的x),y,z)
,其中第二个参数是
x
的生成器表达式,则在定义生成器表达式时仍然需要括号

政治公众人物顺便提到,在这种情况下,解包语法的进一步扩展可能会令人困惑。如果一种新的生成器表达式
(*x代表嵌套中的x)
是合法的(它不是最终政治公众人物的一部分,但考虑了一段时间),那么
foo(*x代表嵌套中的x)
应该如何工作?它是否等同于
foo((*x表示嵌套中的x))
(使用单个生成器表达式调用,其中包括新的“展平”
*
),或者它的意思是
foo(*(x表示嵌套中的x))
(现在这是合法的)