본문 바로가기

소프트웨어/Python + JS + HTML

[python] 다양한 매개변수 입력(*args, **kwargs)

이번에는 파이썬 코드 분석 및 개발할 때 가장 많이 사용하는 문법 중 하나인 *args와 **kwargs를 쉽게 설명해보겠습니다.

 

문법을 이해하는데 가장 쉬운 방법은 글을 보는 것보다는 예시로 코드를 이해하는 것입니다.

 

아래 예제를 차근차근 분석해 보시죠.

 

# 다양한 매개변수 입력(*args, **kwargs)
def agrs_test(name, *contents, point=None, **attrs):
    return '<agrs_test> -> ({}) ({}) ({}) ({})'.format(name, contents, point, attrs)


print('EX1-1 -', agrs_test('test1'))
print('EX1-2 -', agrs_test('test1', 'test2'))
print('EX1-3 -', agrs_test('test1', 'test2', 'test3'))
print('EX1-4 -', agrs_test('test1', 'test2', 'test3', id='admin'))
print('EX1-4 -', agrs_test('test1', 'test2', 'test3', id='admin', point=7))
print('EX1-4 -', agrs_test('test1', 'test2', 'test3', id='admin', password='1234', point=7))

이 코드를 보고 print 문 결과를 예측 할 수 있다면 이해가 되었다고 할 수 있습니다.

 

정답은 아래와 같습니다.

EX1-1 - <agrs_test> -> (test1) (()) (None) ({})
EX1-2 - <agrs_test> -> (test1) (('test2',)) (None) ({})
EX1-3 - <agrs_test> -> (test1) (('test2', 'test3')) (None) ({})
EX1-4 - <agrs_test> -> (test1) (('test2', 'test3')) (None) ({'id': 'admin'})
EX1-4 - <agrs_test> -> (test1) (('test2', 'test3')) (7) ({'id': 'admin'})
EX1-4 - <agrs_test> -> (test1) (('test2', 'test3')) (7) ({'id': 'admin', 'password': '1234'})

이해가 되시는지요?

*args 가 붙은것은 인자로 튜플로 받습니다.

**kwargs 는 딕셔너리 형태입니다.

 

따라서 인자가 하나인 경우는 무조건 name으로 할당되지만 그 다음부터는 contents에 튜플형태로 쌓입니다.

인자중에 키가 point인 경우는 3번째 인자에 할당이 되고 나머지 키가 있는 부분은 마지막 **attrs 에 딕셔너리 형태로 할당됩니다.

 

추가로 해당 인자들을 좀더 디테일하게 알고 싶다면..

아래와 같이 입력을 합니다.

from inspect import signature
# 모든 정보 출력
for name, param in sg.parameters.items():
    print('EX2-3 -', name, param.kind, param.default)

다음과 같은 결과를 얻는데 이부분을 보면 더 명확하게 이해가 됩니다.

EX2-1 - name POSITIONAL_OR_KEYWORD <class 'inspect._empty'>
EX2-1 - contents VAR_POSITIONAL <class 'inspect._empty'>
EX2-1 - point KEYWORD_ONLY None
EX2-1 - attrs VAR_KEYWORD <class 'inspect._empty'>

각각의 인자들의 특성을 생각하면서 이해해보시면 좋을 것 같습니다.

name은 순서 혹은 키워드로 인자가 전달되고

contents는 Var의 순서대로...바로 튜플을 말하고 있네요

point는 point의 키워드가 명시된 인자만으로 한정되어 있고,

attrs는 키가 있는 형태를 인자로 할당받고 있습니다. 바로 딕셔너리죠

 

파이썬 고수가 되는 날까지 화이팅입니다.