programing

**kwargs 인수를 **kwargs를 사용하여 다른 함수에 전달합니다.

bestcode 2023. 2. 6. 23:34
반응형

**kwargs 인수를 **kwargs를 사용하여 다른 함수에 전달합니다.

다음 예제를 이해하지 못했습니다.이러한 기능이 있다고 칩시다.

# python likes
def save(filename, data, **kwargs):
    fo = openX(filename, "w", **kwargs) # <- #1
    fo.write(data)
    fo.close()
# python doesnt like
def save2(filename, data, **kwargs):
    fo = openX(filename, "w", kwargs) # <- #2
    fo.write(data)
    fo.close()

def openX(filename, mode, **kwargs):
    #doing something fancy and returning a file object

왜 1번이 올바른 솔루션이고 2번이 잘못된 솔루션일까요? **kwargs기본적으로 dict이기 때문에 인수를 openX로 넘기고 싶다면 올바른 방법은 이 명령어를 사용하지 않는 것입니다.**명령만 내리면 돼하지만 Python은 분명히 두 번째 것을 좋아하지 않고 두 개의 주장이 아닌 세 개의 주장을 했다고 내게 말한다.

그럼 이 배경은 무엇일까요?

두 번째 예에서는 파일 이름, 모드 및 사전의 3가지 인수를 지정합니다.kwargsPython은 2개의 정식 인수와 키워드 인수를 예상합니다.

사전 앞에 '**'를 붙이면 사전의 압축을 풉니다.kwargs키워드 인수로 이동합니다.

사전(타입)dict)는 키와 값의 쌍을 포함하는 단일 변수입니다.

"Keyword arguments"는 키 값입니다.

사전은 키워드 인수에 프리픽스를 붙임으로써 전개할 수 있습니다.**기능 호출 중.

@gecco의 답변을 확장하면 다음 예에서 차이를 알 수 있습니다.

def foo(**kwargs):
    for entry in kwargs.items():
        print("Key: {}, value: {}".format(entry[0], entry[1]))

# call using normal keys:
foo(a=1, b=2, c=3)
# call using an unpacked dictionary:
foo(**{"a": 1, "b":2, "c":3})

# call using a dictionary fails because the function will think you are
# giving it a positional argument
foo({"a": 1, "b": 2, "c": 3})
# this yields the same error as any other positional argument
foo(3)
foo("string")

여기서 사전의 압축을 푸는 방법과 실제 사전 전송이 실패한 이유를 볼 수 있습니다.

**구문은 Python에게 키워드 인수를 사전에 수집하도록 지시합니다.save2는 그것을 비표준 인수(사전 객체)로 전달하고 있습니다.openX키워드 인수가 표시되지 않기 때문에**args사용되지 않습니다.대신 세 번째 비키워드 인수(사전)를 얻습니다.이 문제를 해결하려면openX기능.

def openX(filename, mode, kwargs):
    pass

#2의 경우 args는 dict 값을 가진 형식 파라미터일 뿐 키워드 타입 파라미터는 아닙니다.

키워드 type 파라미터를 키워드 인수에 전달하려면 사전 앞에 **를 지정해야 합니다.즉, **args를 의미합니다.

**kw 사용에 대한 자세한 내용은 여기를 참조하십시오.

http://www.saltycrane.com/blog/2008/01/how-to-use-args-and-kwargs-in-python/

사전은 하나의 값이기 때문입니다.키워드 인수 그룹으로 전달할 경우 키워드 확장을 사용해야 합니다.

다음 코드 사용kwargs다른 기능으로 전송합니다.

def myprint( kwargs ):
    # default values
    a = kwargs.get('a', None)
    b = kwargs.get('b', None)

    # print both
    print('a={}, b={}'.format(a,b))

def mytest( **kwargs ):
    myprint( kwargs )

mytest()
mytest(b=2)

수율:

a=None, b=None
a=None, b=2

언급URL : https://stackoverflow.com/questions/9867562/pass-kwargs-argument-to-another-function-with-kwargs

반응형