IT

* args와 ** kwargs는 무엇을 의미합니까?

lottoking 2020. 3. 29. 09:12
반응형

* args와 ** kwargs는 무엇을 의미합니까? [복제]


정확히 무엇 *args**kwargs의미합니까?

파이썬 문서에 따르면, 보이는 것처럼 터플 인수를 전달합니다.

def foo(hello, *args):
    print hello

    for each in args:
        print each

if __name__ == '__main__':
    foo("LOVE", ["lol", "lololol"])

인쇄됩니다 :

LOVE
['lol', 'lololol']

효과적으로 어떻게 사용합니까?


퍼팅 *args및 / 또는 **kwargs그 기능을 함수 정의의 인수 목록의 마지막 항목으로 허용하는 것은 인수 및 / 또는 키워드 인자의 임의의 수에 동의합니다.

예를 들어, 모든 인수의 합계를 반환하는 함수를 작성하려는 경우 공급량에 관계없이 다음과 같이 작성할 수 있습니다.

def my_sum(*args):
    return sum(args)

함수를 재정의하고 사용자가 전달하는 인수로 원래 함수를 호출하려는 경우 객체 지향 프로그래밍에서 더 일반적으로 사용됩니다.

당신은 실제로 그들을 호출 할 필요가 없습니다 args그리고 kwargs그건 그냥 컨벤션입니다. 그것은을의 ***그 마법을한다.

공식 파이썬 문서는 좀 더 심도있게 보입니다 .


또한 상속 관리에 사용합니다.

class Super( object ):
   def __init__( self, this, that ):
       self.this = this
       self.that = that

class Sub( Super ):
   def __init__( self, myStuff, *args, **kw ):
       super( Sub, self ).__init__( *args, **kw )
       self.myStuff= myStuff

x= Super( 2.7, 3.1 )
y= Sub( "green", 7, 6 )

이런 식으로 Sub는 수퍼 클래스 초기화가 무엇인지 실제로 알지 못합니다. 수퍼 클래스를 변경해야한다는 것을 알고 있다면, 각 서브 클래스의 세부 사항을 땀 흘리지 않고도 문제를 해결할 수 있습니다.


에서 멋진 것은 주목 S. 로트의 의견을 - 당신은 또한으로 함수를 호출 할 수 있습니다 *mylist**mydict압축을 풀고 위치 및 키워드 인수에 :

def foo(a, b, c, d):
  print a, b, c, d

l = [0, 1]
d = {"d":3, "c":2}

foo(*l, **d)

인쇄합니다 : 0 1 2 3


또 다른 좋은에 대한 사용 *args**kwargs: 당신은 일반적인 정의 할 수 있습니다 대신 원래 함수의 이러한 래퍼를 반환 장식을 위해 대단한 기능, "모두 잡아".

사소한 캐싱 데코레이터를 사용한 예 :

import pickle, functools
def cache(f):
  _cache = {}
  def wrapper(*args, **kwargs):
    key = pickle.dumps((args, kwargs))
    if key not in _cache:
      _cache[key] = f(*args, **kwargs) # call the wrapped function, save in cache
    return _cache[key] # read value from cache
  functools.update_wrapper(wrapper, f) # update wrapper's metadata
  return wrapper

import time
@cache
def foo(n):
  time.sleep(2)
  return n*2

foo(10) # first call with parameter 10, sleeps
foo(10) # returns immediately

인수의 압축을 풀고 누락 된 인수 등을 처리하는 방법을 명확히하기 위해.

def func(**keyword_args):
  #-->keyword_args is a dictionary
  print 'func:'
  print keyword_args
  if keyword_args.has_key('b'): print keyword_args['b']
  if keyword_args.has_key('c'): print keyword_args['c']

def func2(*positional_args):
  #-->positional_args is a tuple
  print 'func2:'
  print positional_args
  if len(positional_args) > 1:
    print positional_args[1]

def func3(*positional_args, **keyword_args):
  #It is an error to switch the order ie. def func3(**keyword_args, *positional_args):
  print 'func3:'
  print positional_args
  print keyword_args

func(a='apple',b='banana')
func(c='candle')
func2('apple','banana')#It is an error to do func2(a='apple',b='banana')
func3('apple','banana',a='apple',b='banana')
func3('apple',b='banana')#It is an error to do func3(b='banana','apple')

참고 URL : https://stackoverflow.com/questions/287085/what-do-args-and-kwargs-mean

반응형