2014-08-27 2 views
1

함수 호출에서 funcion 헤더 및 인수의 규칙에 대한 매개 변수의 규칙에 대해 약간 혼란 스럽습니다. 문서에 따르면함수 호출 및 * 표현

:

가 여기 내 혼란 포인트가되는 구문이 * 표현식은 함수 호출에 나타날 경우

, 표현은 반복자로 평가해야합니다. 이 반복 가능 요소는 추가 위치 인수 인 것처럼 처리됩니다. 위치 인수 x1, ..., xN이 있고 expression이 y1, ..., yM 시퀀스로 평가되면 M + N 위치 인수 x1, ..., xN, y1, ...가있는 호출과 같습니다. .., yM.

따라서이 같은 함수가있는 경우 :

def func(a, *b): .... 

왜 내가 이런 식으로 뭔가를 할 수 없습니다

func(1, *[2, 3], *[4, 5]) 

는 X1이 동일하지 않습니다, ... xN, y1, ..., yN, w1, ..., wN? 왜 작동하지 않습니까?

+2

인용문과 동일한 문법에는 구문 문법이 포함되어 있습니다. 공식 문법은 ** ** ** 표현식 만 허용합니다. –

답변

4

는 첫째, *args는 함수 선언과 함수 호출에 모두 사용할 수 있다는 사실에 의해 혼동되지 않습니다를. 이 둘은 느슨하게 관련되어 있지만, 같은 것은 아닙니다. 가변 수의 매개 변수로 선언하지 않고 foo(*args)으로 함수를 호출 할 수 있으며 def foo(*args)으로 정의 된 함수는 압축 해제 된 반복 가능 함수로 호출 할 필요가 없습니다.

그러나 실제로보고있는 문제는 함수 호출에서 *args 언팩 만 허용된다는 것입니다. 이것은 단순히 파이썬의 구문이 어떻게 지정되었는지입니다. 나중에 변경 될 수 있습니다. PEP 448은 더 많은 상황에서 사용할 수 있도록 풀기 구문을 일반화합니다. PEP가 승인되고 구현되면 foo(*args, *args2)과 같은 함수 호출이 합법적이됩니다.

0

구문에서 허용하지 않으므로.

당신은 사용할 수있는 동일한 효과를 달성하기 위해 대신 다음

func(1, *([2, 3] + [4, 5])) 
+2

게으른 이터레이터는 함수가 호출되기 전에 완전히 평가 될 것이므로 아무것도 얻을 수 없습니다. – jonrsharpe

+0

@jonrsharpe 당신 말이 맞아요. 나는 (답을 수정하면서) 교정되었다. –

3

먼저, 은 기능 서명이 인 것은 중요하지 않습니다. 호출 구문 인함수 정의은 서로 관련이있는 의미로 *을 사용하는 두 개의 개별 개념입니다. f()의 정의는 여기에서 중요하지 않습니다.

argument_list  ::= positional_arguments ["," keyword_arguments] 
          ["," "*" expression] ["," keyword_arguments] 
          ["," "**" expression] 
          | keyword_arguments ["," "*" expression] 
          ["," keyword_arguments] ["," "**" expression] 
          | "*" expression ["," keyword_arguments] ["," "**" expression] 
          | "**" expression 

| 대안 일부인 각 [...]는 선택 사항입니다 :

그것은 여러 *expression* 부품을 허용하지 않는 Calls expressions documentation에 정의 된 매우 문법이다. 이들 중 어느 것도 *expression이 두 번 이상 나타날 수 없습니다.

| "*" expression ["," keyword_arguments] ["," "**" expression] 

| "*" expression ["," "*" expression] ["," "**" expression] 

잘못된

로 대체 된 Python 2 rendering of the documentation에 버그가 있다는 것을

참고 issue #22288를 참조하십시오. (설명서에는 been fixed이 있음).

미래의 Python 버전 이 제한을 완화합니다. PEP 448 - Additional Unpacking Generalizations 참조; 이것은 초기 버전의 Python 3.5 이후 버전에만 적용됩니다.

+0

왜 단지 하나만 허용하는 이유가 있을까요? 나는 모르지만, 가독성, 유용성 ... – zer0uno

+2

@antox : 초기 구현이 더 간단합니다. PEP는 그것이 확대 될 수있는 것에 초점을 맞추려고합니다. Guido는 그쪽으로 적극적으로 기울어 진 것 같습니다. [관련 Python 문제 (http://bugs.python.org/issue2292)에 대한 그의 의견 참조). –