코규리
article thumbnail

 

python의 arg, kwargs(kward args)의 차이에 대한 포스팅입니다.

 

*(asterisk) 에 대해서

우리는 프로그래밍을 처음 배울 때, 보편적으로 C 혹은 C++로 시작합니다.

그렇게 시작한 프로그래밍 공부에서 처음으로-제대로 마주치게 되는 장벽이 '포인터' 챕터입니다.

그리고 그 포인터의 기호로 *(asterisk)가 사용되지요. 주소값이 담겨진 공간입니다.

그렇다면 파이썬에서 파라미터로 받아올 때 쓰이는 *args, **kwargs또한 포인터의 의미일까요?

아닙니다. 그리고 이 두 파라미터(*와 **)간의 차이도 존재합니다.

 

 

*(args)가 뭐예요?

arg, arg는 arguments로 복수 개의 인자를 뜻합니다. 그리고 이 arg를 표시하기 위하여 '*'(asterisk)로 나타냅니다.

그리고 예를 들어, 여러 개의 인자가 필요한 경우는 다음과 같습니다.

 

C1: 청소년 아이들의 나이를 받아올래요. 그런데 몇 개를 받아와야할지 모르겠어요.

C2: 홈페이지에 가입하는 사람들의 이름을 받아올 겁니다. 그런데 몇 명이나 될지 모르겠습니다.

 

이러한 불특정한 개수의 파라미터를 받아오고자 *args가 쓰이게 됩니다.

(*age, *name 으로 파라미터를 작성하여도 무방합니다.)

 

args의 타입은 무엇일까요? 바로 tuple형태입니다. (주소값 아님!)

python에서 print(type(args)) 코드 입력으로 나오는 값을 확인해보면 tuple이 나옵니다.

(tuple: 불변한 순서가 있는 객체의 집합, 한번 생성시 값 변경 불가)

 

 

 

**(kwargs)가 뭐예요?

kwargs는 keyword argument의 줄임말입니다. 번역으로는 키워드 인자가 되겠지요.

앞선 args와는 달리 딕셔너리 형태인 ['키워드':'값']으로 전달되며 이를 활용할 수 있게 됩니다.

예시는 다음과 같습니다.

#소스코드
def myAge(**kwargs):
	for key, value in kwargs.items():
    		print("{0} is {1}".format(key, value))
            
myAge(MyAge = 22, yourAge = 'i don\'t know')
#출력값
MyAge is 22
yourAge is I don't know

 

소스코드에서, [MyAge:22], [yourAge:'i don't know']가 전달되어 해당 문구가 출력됨을 알 수 있습니다.

 

 

이미 모르고도 활용중인 kwargs가 있다구요?

kwargs의 활용예시 중 대표적인 것이 바로 print문입니다.

print문의 docstring을 보면 다음과 같습니다.

 

help(print)
Help in built-in function print in module builtins:
print(...)
	print(value, ..., sep=' ', end ='\n', file=sys.stdout, flush=False)

	Prints the values to a stream, or to sys.stdout by default.
	Optional keyword arguments:
	file: a file-like object (stream); defaults to the current sys.stdout.
	sep: string inserted between values, default a space.
	end: string appended after the last value, default a newline.
	flush: whether to forcibly flush the stream.

위 내용을 4행부터 번역하면 아래와 같습니다.

 

print(value, ..., sep=' ', end = '\n', file=sys.stdout, flush=False)
스트림값을 출력하거나 sys.stdout을 기본적으로 출력
선택적 키워드 인수:
file: 스트림과 같은 파일; 기본값은 현재 sys.stdout
sep: 값 사이에 문자열이 삽입됨. 기본값은 공백
end: 마지막 값 뒤에 문자열이 추가됨, 기본값은 새 행
flush: 강제로 스트림을 내보낼지 여부

여기에서 end로 인해 기본적으로 print함수 사용시 줄바꿈이 이루어진다는 것을 알 수 있습니다.

그러나 개발자가 의도하는 것이 한 줄로 연속한 출력일 경우에는, end=' '를 추가적으로 작성함으로서 원하는 출력을 이루어 냅니다. 

 

#소스코드
print('My age is', end = ' ')
print('22')

#출력값은 'My age is 22' (개행없음)

이렇게 한 줄로 출력되도록 쓰며, 이 때 end=' ' 가 바로 딕셔너리 형태로, kwargs의 활용이 되고 있던 것입니다.