*args & **kwargs

최창환·2022년 3월 3일
0
post-thumbnail

*args

args는 가변인자를 위한 변수이다. 꼭 args라는 변수를 사용할 필요는 없지만 관례적으로 args를 사용하고 있고 앞에 *만 붙히면 된다. 그렇다면 가변인자는 무엇일까?
가변인자는 함수를 호출할 때 전달하는 argument의 갯수가 다양하게 변하는 것을 말한다. args에 값을 집어넣으면 몇개를 입력하든 함수가 Tuple로 인식하게 된다.

def mixed_params(age, name="아이유", *args):
	print("name=",end=""), print(name)
    print("args=",end=""), print(args)
    print("age=",end=""), print(age)
    
mixed_params(20, "정우성", "01012341234", "number")

위의 코드처럼 args를 통해 호출하는 argument의 갯수가 늘어남을 알 수 있다. args도 정해진 위치가 있는데 args 뒤에 다른 인자가 있으면 Error가 발생한다.

def mixed_params(age, name="아이유", *args, number):
	print("name=",end=""), print(name)
    print("args=",end=""), print(args)
    print("age=",end=""), print(age)
mixed_params(20, "정우성", "01012341234", "number") 
# TypeError 발생!

args 인자가 앞에 할당하고 남은 인자를 모두 가져가기 때문에 뒤에 오는인자는 할당받을게 없기 때문이다.


**kwargs

default value parameter의 개수가 유동적일때 사용하고 입력받은 인자들은 딕셔너리 형태로 저장된다.

def func_param_with_kwargs(name, age, address=0, **kwargs):
    print("name=",end=""), print(name)
    print("age=",end=""), print(age)
    print("kwargs=",end=""), print(kwargs)
    print("address=",end=""), print(address)
 
func_param_with_kwargs("정우성", "20", mobile="01012341234", address="seoul")
# kwargs = {'mobile':'01012341234'}

위 코드의 출력을 보듯이 딕셔너리 형태로 출력되므로 arg와 달리 parmeter명을 같이 보낼 수 있다.
kwargs는 args와 마찬가지로 앞의 인자들이 할당을 받은 후
남은 나머지들을 모두 가져가기 때문에 맨 뒤의 순서에 위치해야 한다.
따라서 뒤에 다른 인자가 붙으면 syntax error가 발생하게 된다.


*args와 **kwargs를 동시에 사용하면?

def mixed_params(age, name="아이유", *args, address=0, **kwargs):
    print("name=",end=""), print(name)
    print("args=",end=""), print(args)
    print("age=",end=""), print(age)
    print("kwargs=",end=""), print(kwargs)
    print("address=",end=""), print(address)
 
mixed_params(20, "정우성", "01012341234", "male" ,mobile="01012341234", address="seoul")
# name=정우성
# args=('01012341234', 'male')
# age=20
# kwargs={'mobile': '01012341234'}
# address=seoul

앞선 인자에 할당되고 남은 default valuable parameter랑 non-default valuable parameter가 각각 kwargs, args에 할당된다.

def name(*args, **kwargs):
    print(args, kwargs)

name(name="GilDong Hong")

# 출력값
# () {'name': 'GilDong Hong'}

위의 코드처럼 arg를 선언하고 사용하지 않을 수도 있는데 이 경우 args는 아무것도 출력되지 않고 kwargs만 key-value형태로 출력된다.

profile
포기하지 않는 개발자

0개의 댓글