Programing

* args, ** kwargs 및 선택적 / 기본 인수를 사용하여 Python 함수 호출

lottogame 2020. 12. 13. 08:35
반응형

* args, ** kwargs 및 선택적 / 기본 인수를 사용하여 Python 함수 호출


파이썬에서는 다음과 같이 함수를 정의 할 수 있습니다.

def func(kw1=None,kw2=None,**kwargs):
   ...

이 경우 func를 다음과 같이 호출 할 수 있습니다.

func(kw1=3,kw2=4,who_knows_if_this_will_be_used=7,more_kwargs=Ellipsis)

함수를 다음과 같이 정의 할 수도 있습니다.

def func(arg1,arg2,*args):
    ...

다음과 같이 부를 수 있습니다.

func(3,4,additional,arguments,go,here,Ellipsis)

마지막으로 두 가지 형태를 결합 할 수 있습니다.

def func(arg1,arg2,*args,**kwargs):
    ...

그러나 작동하지 않는 것은 다음과 같습니다.

func(arg1,arg2,*args,kw1=None,kw2=None,**kwargs):  #SYNTAX ERROR (in python 2 only,  apparently this works in python 3)
    ...

내 원래 생각은 이것이 아마도 기능 때문일 것이라고 생각했습니다.

def func(arg1,arg2,*args,kw1=None):
    ...

다음과 같이 부를 수 있습니다.

func(1,2,3) #kw1 will be assigned 3

따라서 이것은 3이 args 또는 kwargs로 패킹되어야하는지에 대한 모호성을 도입합니다. 그러나 Python 3에서는 키워드 전용 인수를 지정할 수 있습니다.

def func(a,b,*,kw=None):  #can be called as func(1,2), func(1,2,kw=3), but NOT func(1,2,3)
   ...

이것으로 다음과 같은 구문상의 모호성이없는 것 같습니다.

def func(a,b,*args,*,kw1=None,**kwargs):
    ...

그러나 여전히 구문 오류가 발생합니다 (Python3.2로 테스트 됨). 내가 놓친 이유가 있습니까? 그리고 위에서 설명한 동작을 얻을 수있는 방법이 있습니까 (기본 인수와 함께 * args 포함)-함수 내에서 kwargs 사전을 조작하여 해당 동작을 시뮬레이션 할 수 있다는 것을 알고 있습니다.


Python 3에서 있습니다 .

def func(a,b,*args,kw1=None,**kwargs):

bare는를 *사용 하여 가변 개수의 위치 인수를 허용 하지 않고 키워드 전용 인수를 지정하려는 경우에만 사용됩니다 *args. 두 개의 *s를 사용하지 않습니다 .

문법에서 인용하려면 Python 2 에서

parameter_list ::=  (defparameter ",")*
                    (  "*" identifier [, "**" identifier]
                    | "**" identifier
                    | defparameter [","] )

년 동안 파이썬 3 , 당신은

parameter_list ::=  (defparameter ",")*
                    (  "*" [parameter] ("," defparameter)*
                    [, "**" parameter]
                    | "**" parameter
                    | defparameter [","] )

여기에는 매개 변수 뒤에 추가 매개 변수에 대한 조항이 포함됩니다 *.

최신 정보:

최신 Python 3 문서는 여기 .


두 가지를 모두 혼합하려면 * args와 ** kwargs가 마지막으로 지정된 매개 변수 여야합니다.

def func(arg1,arg2,*args,kw1=None,kw2=None,**kwargs): #Invalid
def func(arg1,arg2,kw1=None,kw2=None,*args,**kwargs): #Valid

주석은 제공된 인수가 정의에 지정된 매개 변수에 다시 할당되는 방식과 비교하여 함수 정의가 구성되는 방식을 혼합 한 것으로 보입니다.

이것이 6 개의 매개 변수가있는이 함수의 정의입니다. 함수 호출에서 명명 된 인수와 명명되지 않은 인수를 전달하여 호출됩니다.

For this example... When an argument is named when calling the function it can be provided out of order. arg1 and arg2 are mandatory parameters and if not passed to the function as named arguments, then they must be assigned in order from the provided unnamed arguments. kw1 and kw2 have default values provided in the function definition so they are not mandatory, but if not provided for as named arguments they will take any available values from the remaining provided unnamed arguments. Any unnamed arguments left over are provided to the function in an array called args Any named arguments that do not have a corresponding parameter name in the function definition are provided to the function call in a dictionary called kwargs.

참고URL : https://stackoverflow.com/questions/9872824/calling-a-python-function-with-args-kwargs-and-optional-default-arguments

반응형