👉🏽 파이썬에는 정해진 함수 처리 순서가 있다.
def example(a, b, c=None, r="w" , d=[], *ae, **ab):
(a,b) are positional parameter
(c=none) is optional parameter
(r="w") is keyword parameter
(d=[]) is list parameter
(*ae) is keyword-only
(**ab) is var-keyword parameter
파라미터를 받는 순서는 다음과 같으며 이 순서를 지키지 않을 시 오류가 발생한다.
keyword argument를 position argument보다 앞에 위치 시켰기 때문에 위의 코드에서 오류가 난 것이다.
👉🏽 먼저 가변 인수(variable length arguments)란 임의의 개수의 Positional Arguments 방식으로, Tuple 형태의 변수로 저장한다. parameter에게 넘겨줄 값이 너무 많거나, 개수가 정해지지 않았을 때 사용을 한다. 코드로 설명을 해보자면
def test(a, b, c, *args):
print(a)
print(b)
print(c)
print(args)
test(1, 2, 3, 4, 5, 6)
'''
1
2
3
(4,5,6)
'''
인자를 파라미터에 순서대로 할당을 하고 남은 값들은 한 번에 할당을 하는는 것을 볼 수 있다. 이걸 가변 인수(variable length arguments)라고 한다.
가변의 입력을 받는 args는 맨 뒤에 있거나 keyword와 함께 움직여야한다.
다른 예제를 보자면
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)
이 경우에는 오류가 난다.
그 이유는 무엇인가 보면 args는 가변의 길이를 입력받는 파라미터인데,
번호와 서울, 그리고 20까지 모두를 가변의 값으로 인식을 해서 3개의 값 모두 들어게가 된다. 그로인해 age라는 파라미터 값이 없게된다.
이 경우는 age를 keyword로 바꿔서 오류를 잡을 수 있다.
def exam1(name, *args, age):
print("name=",end=""), print(name)
print("args=",end=""), print(args)
print("age=",end=""), print(age)
exam1("정우성", "01012341234", "seoul", age = 20)
'''
name=정우성
args=('01012341234', 'seoul')
age=20
'''
3.가변 키워드 인수 (variable length keyword arguments)의 위치를 다음 참고 자료를 통해 조사해서 어떤에러 인지 확인하고 함수가 호출되도록 에러를 고치고 호출후에 출력되는 결과를 블로그에 정리해 주세요.
👉🏽 먼저 가변 키워드 인수 (variable length keyword arguments)는 임의의 개수의 Keyword Arguments 방식으로, Dictionary 형태의 변수로 저장한다.
def test(a, b, **kwargs):
print(a)
print(b)
print(kwargs)
test(1, 2, name = "Lee", age = 23, company = "Wecode")
'''
1
2
{'name': 'Lee', 'age': 23, 'company': 'Wecode'}
'''
문제
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")
<mobile="01012341234">이라는 variable Length Keyword가 keyword parameter보다 앞에 있기 때문에 오류가 난걸로 보인다.
#address parameter를 kwargs parameter 앞으로 옮겨준다.
def exam2(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)
exam2("정우성", "20", 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")
👉🏽 나는 일단 키워드가 있는 address를 **kwargs 앞으로 빼고 입력하는 인자 순서를 파라미터 처리 순서에 맞춰 변경했다.
def mixed_params(name="아이유", *args, age, 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("정우성", "01012341234", "male", age=20, address="seoul", mobile="01012341234")
'''
name=정우성
args=('01012341234', 'male')
age=20
kwargs={'mobile': '01012341234'}
address=seoul
'''
값이 잘 나오는걸 볼 수 있다.