Python에서 **kwargs를 사용하는 올바른 방법
적절한 사용방법은 무엇입니까?**kwargs
Python에서는 디폴트값이 어떻게 됩니까?
kwargs
는 사전을 반환하지만 기본값을 설정하는 가장 좋은 방법 또는 사전을 반환할 수 있습니까?그냥 사전으로 찾아보면 되나요?get 기능을 사용하시겠습니까?
class ExampleClass:
def __init__(self, **kwargs):
self.val = kwargs['val']
self.val2 = kwargs.get('val2')
간단한 질문이지만 좋은 자료를 찾을 수 없는 질문입니다.사람들은 내가 본 코드에서 다른 방식으로 그것을 하고 무엇을 사용해야 할지 알기 어렵다.
기본값을 다음에 전달할 수 있습니다.get()
사전에 없는 키의 경우:
self.val2 = kwargs.get('val2',"default value")
단, 특정 인수를 특정 기본값과 함께 사용할 계획이라면 처음부터 명명된 인수를 사용하는 것이 좋습니다.
def __init__(self, val2="default value", **kwargs):
대부분의 답변이 그렇게 말하지만, 예를 들어,
def f(**kwargs):
foo = kwargs.pop('foo')
bar = kwargs.pop('bar')
...etc...
"동일"
def f(foo=None, bar=None, **kwargs):
...etc...
그건 사실이 아니야후자의 경우,f
라고 불릴 수 있다f(23, 42)
단, 전자의 경우는 이름 있는 인수만 받아들이며 위치 콜은 받지 않습니다.대부분의 응답에서 주장하듯이 발신자에게 최대한의 유연성을 부여하고 싶은 경우가 많기 때문에 두 번째 형식이 바람직합니다.다만, 항상 그렇지는 않습니다.일반적으로 몇 개만 전달되는 옵션 파라미터를 다수 수용하는 경우 명명된 인수를 강제로 사용하는 것이 좋은 아이디어(콜 사이트에서 사고나 판독 불가능한 코드를 피하는 것이 좋습니다).threading.Thread
예를 들어 보겠습니다.첫 번째 형태는 Python 2에서 그것을 구현하는 방법입니다.
이 관용구는 매우 중요하기 때문에 Python 3에서는 특별한 지원 구문을 가지고 있습니다: 모든 인수는 싱글 뒤에 있습니다.*
에서def
시그니처는 키워드 전용입니다.즉, positional 인수로 전달할 수 없고 이름 있는 인수로만 전달할 수 있습니다.따라서 Python 3에서는 위의 내용을 다음과 같이 코드화할 수 있습니다.
def f(*, foo=None, bar=None, **kwargs):
...etc...
실제로 Python 3에서는 선택사항이 아닌 키워드 전용 인수(기본값이 없는 인수)도 사용할 수 있습니다.
그러나 Python 2는 아직 생산적인 수명이 길기 때문에 Python 3의 언어로 직접 지원되는 중요한 디자인 아이디어를 Python 2에서 구현할 수 있는 기술과 숙어를 잊지 않는 것이 좋습니다.
저는 이런 걸 제안합니다.
def testFunc( **kwargs ):
options = {
'option1' : 'default_value1',
'option2' : 'default_value2',
'option3' : 'default_value3', }
options.update(kwargs)
print options
testFunc( option1='new_value1', option3='new_value3' )
# {'option2': 'default_value2', 'option3': 'new_value3', 'option1': 'new_value1'}
testFunc( option2='new_value2' )
# {'option1': 'default_value1', 'option3': 'default_value3', 'option2': 'new_value2'}
원하는 방식으로 값을 사용할 수 있습니다.
dictionaryA.update(dictionaryB)
의 내용을 추가합니다.dictionaryB
로.dictionaryA
중복된 키를 덮어씁니다.
당신은 할 것이다
self.attribute = kwargs.pop('name', default_value)
또는
self.attribute = kwargs.get('name', default_value)
사용하시는 경우pop
송신된 스플리어스 값이 없는지 확인하고 적절한 액션(있는 경우)을 실행할 수 있습니다.
**kwargs 및 기본값을 사용하는 것은 간단합니다.단, **kwargs를 처음부터 사용해서는 안 되는 경우가 있습니다.
이 경우 **kwargs를 제대로 활용하지 못하고 있습니다.
class ExampleClass( object ):
def __init__(self, **kwargs):
self.val = kwargs.get('val',"default1")
self.val2 = kwargs.get('val2',"default2")
위는 "왜 귀찮아?" 선언입니다.와 같다.
class ExampleClass( object ):
def __init__(self, val="default1", val2="default2"):
self.val = val
self.val2 = val2
**kwargs를 사용하는 경우 키워드는 옵션일 뿐만 아니라 조건부임을 의미합니다.단순한 기본값보다 더 복잡한 규칙이 있습니다.
**kwargs를 사용하는 경우 보통 다음과 같은 의미입니다.단순한 기본값은 적용되지 않습니다.
class ExampleClass( object ):
def __init__(self, **kwargs):
self.val = "default1"
self.val2 = "default2"
if "val" in kwargs:
self.val = kwargs["val"]
self.val2 = 2*self.val
elif "val2" in kwargs:
self.val2 = kwargs["val2"]
self.val = self.val2 / 2
else:
raise TypeError( "must provide val= or val2= parameter values" )
★★**kwargs
인수의 수를 알 수 없는 경우에 사용됩니다.왜렇 게지 ?? ?? ???
class Exampleclass(object):
def __init__(self, **kwargs):
for k in kwargs.keys():
if k in [acceptable_keys_list]:
self.__setattr__(k, kwargs[k])
또 다른 접근방식은 다음과 같습니다.
def my_func(arg1, arg2, arg3):
... so something ...
kwargs = {'arg1': 'Value One', 'arg2': 'Value Two', 'arg3': 'Value Three'}
# Now you can call the function with kwargs like this:
my_func(**kwargs)
합니다.**kwargs
Python 을 합니다.setdefault
뭇매를 맞다
class ExampleClass:
def __init__(self, **kwargs):
kwargs.setdefault('val', value1)
kwargs.setdefault('val2', value2)
이와 사용자가 '전달한 'val'은 'val2'는 'val2'가 .args
이 값이 사용됩니다.그렇지 않으면 설정된 기본값이 사용됩니다.
class ExampleClass(object):
__acceptable_keys_list = ['foo', 'bar']
def __init__(self, **kwargs):
[self.__setattr__(key, kwargs.get(key)) for key in self.__acceptable_keys_list]
은 우리 될 때 합니다.acceptable
참조해 주세요.
이런 것도 할 수 있고
class ExampleClass:
def __init__(self, **kwargs):
arguments = {'val':1, 'val2':2}
arguments.update(kwargs)
self.val = arguments['val']
self.val2 = arguments['val2']
이 값을 *args와 결합하려면 정의 끝에 *args와 **kwargs를 유지해야 합니다.
그래서:
def method(foo, bar=None, *args, **kwargs):
do_something_with(foo, bar)
some_other_function(*args, **kwargs)
불분명한 인수 또는 여러 인수를 처리하기 위한 다른 간단한 솔루션은 다음과 같습니다.
class ExampleClass(object):
def __init__(self, x, y, **kwargs):
self.x = x
self.y = y
self.attributes = kwargs
def SomeFunction(self):
if 'something' in self.attributes:
dosomething()
**kwargs에서는 키워드 인수를 원하는 수만큼 추가할 수 있습니다.기본값을 설정할 수 있는 키 목록이 있을 수 있습니다.단, 키의 수가 한정되지 않은 경우에는 기본값을 설정할 필요가 없습니다.마지막으로 키를 인스턴스 속성으로 사용하는 것이 중요할 수 있습니다.그래서 저는 이렇게 하겠습니다.
class Person(object):
listed_keys = ['name', 'age']
def __init__(self, **kwargs):
_dict = {}
# Set default values for listed keys
for item in self.listed_keys:
_dict[item] = 'default'
# Update the dictionary with all kwargs
_dict.update(kwargs)
# Have the keys of kwargs as instance attributes
self.__dict__.update(_dict)
@가 @AbhinavGupta를 사용할 것을 Steef 。update()
목록을 하는 데 큰 이 된다는 것을 알 수
args.update(kwargs)
@은 @VinaySajip이 @VinaySajip을 했다고 합니다.pop()
를 사용하여 인수 목록을 반복적으로 처리할 수 있습니다.을 사용하다
또 , 할 수 있습니다.이 방법에서는 를 사용하는 간단한 구문을 유지합니다.update()
:
# kwargs = dictionary of user-supplied arguments
# args = dictionary containing default arguments
# Check that user hasn't given spurious arguments
unknown_args = user_args.keys() - default_args.keys()
if unknown_args:
raise TypeError('Unknown arguments: {}'.format(unknown_args))
# Update args to contain user-supplied arguments
args.update(kwargs)
unknown_args
는 입니다.set
기본값에서 발생하지 않는 인수 이름을 포함합니다.
언급URL : https://stackoverflow.com/questions/1098549/proper-way-to-use-kwargs-in-python
'itsource' 카테고리의 다른 글
Java 응용 프로그램의 악성 코드에 대한 샌드박스 (0) | 2023.01.08 |
---|---|
모든 Java 소스가 오류 없이 컴파일될 때 Eclipse에서 패키지 탐색기 "red-x" 오류 아이콘의 원인은 무엇입니까? (0) | 2023.01.08 |
JavaScript로 끝남 (0) | 2022.12.24 |
파일이 python에서 디렉토리인지 일반 파일인지 확인하는 방법 (0) | 2022.12.24 |
@Transactional annotation: 인터페이스 정의 또는 구현 클래스 어디에 배치해야 합니까? (0) | 2022.12.24 |