**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가지 인수를 지정합니다.kwargs
Python은 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
'programing' 카테고리의 다른 글
MySQL 발생 횟수가 2를 초과합니다. (0) | 2023.02.06 |
---|---|
PDO:: 10진수 타입의 PARAM? (0) | 2023.02.06 |
PHPnit을 사용하여 PHP 헤더 테스트 (0) | 2023.02.06 |
Java에서 숫자를 단어로 변환하는 방법 (0) | 2023.02.06 |
jQuery를 사용하여 하이퍼링크의 href 속성을 변경하는 방법 (0) | 2023.02.06 |