가변인수와 가변키워드 인수

wind1992·2020년 6월 15일
0

만약,

한정적인 인자가 아닌 그이상의 정해지지 않은 인자를 받고싶을때, 수많은 인자를 선언하기도 번거롭고 수가 정해지지 않았을때 같은형태로는 처리가 불가능하다. 이떄 사용하는 것이 **가변인자 (Variable Argument)이고,

position arguments와 keyword arguemnts 모두 사용할 수 있으며, 밑에서 자세히 다뤄보겠다.


positional arguments 만 받을 때

def save_foods(*args):
    print(args)

save_foods('떡볶이', '카레', '한우', '라면', '아이스크림')

# Result

# ('떡볶이', '카레', '한우', '라면', '아이스크림')



keyword arguments 만 받을 때

def save_number(**kwargs):
    print(kwargs)

save_number(one='일', two='이', three='삼')


# Result

# {'one': '일', 'two': '이', 'three': '삼'}



positional arguments와 keyword arguments를 모두 받을 때


def save_foods(*args, **kwargs):
    print(args)
    print(kwargs)
    
save_foods('라면', '떡볶이', '한우', one='일', two='이')
 

# Result

# ('라면', '떡볶이', '한우')
# {'one': '일', 'two': '이'}



*args는 임의의 갯수의 positional arguments를 받음을 의미하며, **kwargs는 임의의 갯수의 keyword arguments를 받음을 의미한다. 이 때 *args, **kwargs 형태로 가변인자를 받는걸 packing이라고 한다. 위에 예시를 보면, 임의의 갯수와 임의의 키값을 갖는 인자들을 전달하고 있다. positional 형태로 전달되는 인자들은 args라는 tuple에 저장되며, keyword 형태로 전달되는 인자들은 kwargs라는 dict에 저장된다. 보통 오픈소스의 경우 코드의 일관성을 위해 *args이나 **kwargs와 같이 관례적으로 사용되는 인자명을 사용하지만, *required나 **optional과 같이 인자명은 일반 변수와 같이 원하는대로 지정이 가능하다. (단, 만약 오픈소스 프로젝트를 하고 있고, 인자에 특별한 의미가 있지 않은 일반적인 가변인자라면 *args와 **kwargs와 같이 관례를 따르는게 좋다.)



Arguments 예제

첫번째

  • Code
def func_param_with_var_args(name, *args, age):
    print("name=",end=""), print(name)
    print("args=",end=""), print(args)
    print("age=",end=""), print(age)
    
func_param_with_var_args("wecode", "01012341234", "seoul", 20)
 

# Error

# TypeError: func_param_with_var_args() missing 1 required keyword-only argument: 'age'

After fixing

  • Code
def func_param_with_var_args(name, age, *args):
    print("name=", end=""), print(name)
    print("args=", end=""), print(args)
    print("age=", end=""), print(age)


func_param_with_var_args("wecode", 20, "01012341234", "seoul")
	
#함수 파라미터중 position arguments인 age 위치에맞게 함수 호출 인자 '20'을 옮겼다.

 

# Result

# name=wecode
# args=('01012341234', 'seoul')
# age=20



두번째

  • Code
def func_param_with_kwargs(name, age, **kwargs, address=0):
    print("name=", end=""), print(name)
    print("age=", end=""), print(age)
    print(“kwargs=, end=“”), print(kwargs)
    print(“address=, end=“”), print(address)


func_param_with_kwargs("wecode", "20", mobile="01012341234", address="seoul")
 

# Error

# SyntaxError: invalid syntax
# keyword는 positional보다 앞에 선언할 수 없기 때문에 error가 발생

After fixing


  • Code
def func_param_with_kwargs(name, age,  address=0, **kwargs):	#keyword arguments인 **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("wecode", "20", mobile="01012341234", address="seoul")
 

# Result

# name=wecode
# age=20
# kwargs={'mobile': '01012341234'}
# address=seoul

세번째


  • Code
def mixed_params(name="wecode", *args, age, **kwargs, address):
    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, "wecode", "01012341234", "male" ,mobile="01012341234", address="seoul")
 

# Error

# position arguments 과 keyword arguments 들의 위치가 알맞지않다.

After fixing

  • Code
def mixed_params(name="wecode", *args, age, **kwargs, address):
    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, "wecode", "01012341234", "male" ,mobile="01012341234", address="seoul")

#	위치만 바꿔서 오류를 수정해보았다.

or

def mixed_params(age, address, name="wecode", *args, **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, "seoul", "wecode", "01012341234", "male", mobile="01012341234")

위치를 바꾸고, 함수호출부분의 파라미터 address부분을 keyword가아닌 position arguments로 바꿔서
에러를 고쳤다.

 

# Result

# name=wecode
# args=('01012341234', 'male')
# age=20
# kwargs={'mobile': '01012341234'}
# address=seoul
profile
게으른 개발자

0개의 댓글