itsource

Python에서 **kwargs를 사용하는 올바른 방법

mycopycode 2022. 12. 24. 17:28
반응형

Python에서 **kwargs를 사용하는 올바른 방법

적절한 사용방법은 무엇입니까?**kwargsPython에서는 디폴트값이 어떻게 됩니까?

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이 값이 사용됩니다.그렇지 않으면 설정된 기본값이 사용됩니다.

설정 사용에 대한 @srhegde 제안의 후속 조치:

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

반응형