Python, 가변 길이 위치 인수 뒤의 기본 키워드 인수


81

파이썬 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)

기타

답변:


70

작동하지만 Python 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

마찬가지로 키워드 전용 인수는 기본값을 가질 필요가 없습니다. *args인수 뒤에 오는 것은 기본값이 아니라 키워드 전용으로 표시하는 것입니다.

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

당신과 Imran 모두에게 감사합니다! Imran의 코드 블록 및 독 스트링 제안에 대한 귀하의 답변은 질문에 완벽하게 답변했습니다.
jkmacc

50

파이썬의 구문은 함수와 키워드 인자에 변수 인자를 기본값으로 동시에 허용하지 않습니다. 임의의 수의 위치 인수와 함께 키워드 인수가 있어야하는 경우 임의의 수의 키워드 인수도 허용해야합니다.

이것은 키워드 인수에 대한 기본값을 제공하고 임의의 수의 위치 인수를 허용하는 일반적인 패턴입니다.

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

추가 키워드 인수를 전혀 사용하지 않으면 걱정할 필요가 없습니다. 이로 인해 함수가 자체 문서화가 약간 줄어들어 적절하게 작성된 독 스트링으로 구성 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.