2010-04-25 4 views
7

여기에 뭔가가 빠졌습니까? 왜 "깨진"섹션 아래의 코드가 작동하지 않아야합니까? Python 2.6을 사용하고 있습니다.이상한 구문 구문 분석 파이썬에서 오류가 발생 했습니까?

#!/usr/bin/env python 

def func(a,b,c): 
    print a,b,c 

#Working: Example #1: 

p={'c':3} 

func(1, 
    b=2, 
    c=3, 
    ) 

#Working: Example #2: 

func(1, 
    b=2, 
    **p) 

#Broken: Example #3: 

func(1, 
    b=2, 
    **p, 
    ) 
+2

파이썬 2.6에서이 코드를 실행하면 19 번째 줄에 구문 오류가 발생합니다 (두 번째 작업). –

+0

예 # 2에서 사소한 오타가 수정되었습니다. – user213060

+1

그리고 (중요하지 않은) : 왜이 ​​extraenous comma를 원합니까? (이 행동을 연구하는 것을 제외하고)? – ChristopheD

답변

9

이것은 grammar에서 해당 비트는 다음과 같습니다

arglist: (argument ',')* (argument [','] 
         |'*' test (',' argument)* [',' '**' test] 
         |'**' test) 

첫 번째 줄은 여기에 가변 인자/kwargs로를 (당신의 첫 번째 예제가 작동하는 이유는) 사용하지 않을 때 마지막 매개 변수 다음에 쉼표를 넣어 수 있습니다 . 그러나 두 번째 줄과 세 번째 줄에 표시된 것처럼 kwargs 매개 변수가 지정된 경우 쉼표를 입력 할 수 없습니다.

f(a=1, b=2, c=3,) 
f(*v, a=1, b=2, c=3) 

하지만이되지 않습니다 : : 이들은 모두 합법적

:

f(*v, a=1, b=2, c=3,) 

그것은 이해하지 만드는 방법으로

, 여기에 문법으로 표시 흥미로운 일이다 **kwargs 뒤에 쉼표를 허용하려면 항상 마지막 매개 변수 여야합니다. 나는 언어 설계자가 나의 마지막 예를 허용하지 않기로 결정한 이유를 모르지만 - 어쩌면 감독이었을 까?

5

보통 파이썬은 (인수 목록 및 컨테이너 리터럴에서) 쉼표 목록의 끝에 추가 쉼표를 허용합니다. 이를위한 주된 목표는 코드 생성을 약간 더 쉽게 만드는 것입니다 (마지막 항목을 특수화 할 필요가 없으며 싱글 톤 튜플을 두 번 특수화 할 필요가 없습니다).

문법의 정의에서 여분의 선택적인 콤마없이 **kwargs을 따로 꺼냅니다. 상상할 수있는 코드 생성과 같은 실용적인 도움이되지는 않을 것입니다. (** kwargs가 항상 마지막 일 이니까 특별한 경우는 필요 없습니다.) 그래서 파이썬이 왜 지원할 지 모르겠습니다. 그것.

관련 문제