* 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
'IT' 카테고리의 다른 글
IntelliJ IDEA에서 Eclipse의 Ctrl + O (Show Outline) 단축키는 무엇입니까? (0) | 2020.03.29 |
---|---|
정적이 아닌 변수는 정적 컨텍스트에서 참조 할 수 없습니다 (0) | 2020.03.29 |
WiX 트릭과 팁 (0) | 2020.03.29 |
C #에서 필드를 '읽기 전용'으로 표시하면 어떤 이점이 있습니까? (0) | 2020.03.29 |
스칼라에서 루프를 끊으려면 어떻게해야합니까? (0) | 2020.03.29 |