non-default value parameter는 함수가 호출될때 Parameter에
1. 인자를 받아 넘겨줄 수도 있고,
2. 인자를 넘겨주지 않아도 keywordname = value
형식으로 선언되어 있기 때문에 value
를 넘겨줄 수 있다.
default value parameter 앞에 non-default value parameter 를 정의하면 안된다.
def love_you(my_name = "정우성", your_name):
print("{} loves {}".format(my_name, your_name))
love_you("아이유")
다음과 같이 작성 후 실행하면 이런 에러가 뜬다.
SyntaxError: non-default argument follows default argument
왜냐하면
love_you()
의 첫 번째 인자로 받은 "아이유"
가 "정우성"
으로 값이 설정되어있던 my_name
의 value 를 업데이트 하지만, your_name
은 아무 값도 넘겨받지 못하기 때문이다. 다음 get_parameters()
함수를 호출하여 파라미터를 넘길 때 우리가 name
의 값을 디폴트로 주고, address
는 항상 키워드 인자로 넘긴다고 가정해보자.
그렇다면 해당 함수 파라미터의 올바른 순서는 다음과 같다.
def get_parameters(age, name="default", *args, address=0, **kwargs):
pass
그렇다면 호출은 어떻게 해야할까?
get_parameters(20, 'hi', 'there', mobile="01012345678", address="seoul")
# 함수 호출 시 address="seoul" 의 위치는 키워드 가변인자의 앞 또는 뒤에 넣어줘야 한다.
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("정우성", "01012341234", "seoul", 20)
TypeError: func_param_with_var_args() missing 1 required keyword-only argument: 'age'
*args
파라미터가 name
다음에 오는 인자들을 다 받아버리기 때문에 age
까지 인자가 도달하지 않는다.
따라서 다음과 같이 age
와 *args
순서를 바꿔야 한다.
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("정우성", "01012341234", "seoul", 20)
출력 결과는 다음과 같다.
name=정우성
args=('seoul', 20)
age=01012341234
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("정우성", "20", mobile="01012341234", address="seoul")
다음을 실행하면 SyntaxError
가 발생한다.
regular parameter after ** parameter
address="seoul"
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")
키워드 가변인수 앞으로 keyword-only argument 를 옮겼더니, 출력이 성공적으로 됐다.
name=정우성
age=20
kwargs={'mobile': '01012341234'}
address=seoul
def mixed_params(name="아이유", *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, "정우성", "01012341234", "male" ,mobile="01012341234", address="seoul")
SyntaxError: invalid syntax
위의 코드 결과가 에러가 뜨는 이유는 문법이 틀렸기 때문이다.
다시 정리해보자
age
name="아이유"
*arg
address
**kwargs
age
name="아이유"
*args
address
, 이 부분이 가장 헷갈렸는데 왜냐하면 1번 age
과 모양이 같았기 때문이다.address="seoul"
이기 때문에 age
파라미터로 넘기는 값 20
과는 다르다.**kwargs
위 우선순위를 적용해서 코드를 다시 작성해보았다.
def mixed_params(age, name="아이유", *args, address, **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
다음과 같이 원하는 값이 잘 출력되었다.