69

Python 2에서 함수 호출시 가변 길이 위치 매개 변수 뒤에 명명 된 매개 변수를 사용할 수 있다고 생각했지만 파이썬 클래스를 가져올 때 SyntaxError이 표시됩니다. 나는 예를 들어, 다음과 같은 "GET"방식으로 쓰고 있어요 :가변 길이 위치 지정 인수 뒤의 기본 키워드 인수

class Foo(object): 
    def __init__(self): 
     print "You have created a Foo." 

    def get(self, *args, raw=False, vars=None): 
     print len(args) 
     print raw 
     print vars 

를 오류는 다음과 같습니다

def get(self, *args, raw=False, vars=None): 
        ^
SyntaxError: invalid syntax 

나는 방법 몇 가지 방법을 호출 할 수 싶습니다

f = Foo() 
f.get(arg1, arg2) 
f.get(arg1, raw=True) 
f.get(arg1, arg2, raw=True, vars=something) 

답변

61
그것은 작업을 수행

,하지만 파이썬 3 참조 PEP 3102인치 "새로운 기능"문서를 훑어 보니, 2.x 백 포트가 없으므로 운이 좋지 않습니다. 키워드 인수 (**kwargs)를 수락하고 수동으로 구문 분석해야합니다. d.get(k, default)을 사용하면 d[k] 또는 default을 얻을 수 있습니다. 인수를 kwargs에서 제거하려면 다음과 같이하십시오. 수퍼 클래스 '메서드를 호출하기 전에 d.pop을 사용하십시오. def get(self, *args, raw=False, vars=None):에서 raw=Falsevars=None 키워드 인수와는 아무 상관이 없다는


참고. 이것들은 기본 인수 값입니다. 기본 값으로 인수 위치 적으로 전달 될 수 있으며, 기본 값없이 인수는 키워드에 의해 전달 될 수

def f(a=1): pass 
f(2) # works, passing a positionally 
def f(a): pass 
f(a=2) # works, passing a by keyword 

은 마찬가지로, 키워드 전용 인수가 기본값이 할 필요가 없습니다.

def f(*args, a): pass 
# a is a mandatory, keyword-only argument 
+0

당신과 이므 란에게 감사드립니다! 이므 란의 코드 블록 및 문서 문자열 제안에 대한 귀하의 답변은 질문에 완벽하게 답변했습니다. – jkmacc

41

파이썬의 구문은 동시에 기능 및 기본 값 키워드 인수에 변수 인수를 허용하지 않습니다 다음 *args 인수 후 오는 키워드 전용, 기본 값이 아닌 존재로를 표시하는 것이다. 임의의 수의 위치 인수와 함께 키워드 인수가 있어야하는 경우, 임의의 수의 키워드 인수도 허용해야합니다.

이 공통 키워드 인수에 대한 기본 값을 제공하는 패턴뿐만 아니라 위치 인수를 무제한으로 허용하는 것입니다 : 당신이 전혀 여분의 키워드 인수를 사용하지 않는 경우

def foo(*args, **kwargs): 
    raw = kwargs.pop('raw', False) 
    vars = kwargs.pop('vars', None) 

, 당신은 아무것도를 에 대해서 걱정하다. 이렇게하면 함수를 조금 더 적게 자체 문서화 할 수 있습니다. 제대로 문서화 된 문서 문자열을 만들 수 있습니다.