함수의 변수를 정함에 있어 몇가지 규칙이 있다.
4번 규칙에 대해 생각해 보자. 함수를 정의 할때 default value parameter(기본값 매개변수)를 non-default value parameter(기본값 미지정 매개변수, 일반 변수) 앞에 정의 하면 안 되는 이유는 무엇일까?
왜냐하면 기본값 매개변수은 생략이 가능하며 함수 사용시 생략했을때 일반 변수인지 기본값 매개변수인지 구별할 수 없기 때문이다.
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)
위 예제를 실행해보자.
Traceback (most recent call last):
File "main.py", line 5, in
func_param_with_var_args("정우성", "01012341234", "seoul", 20)
TypeError: func_param_with_var_args() missing 1 required keyword-only argument: 'age'
에러코드 내용을 보니 age에 해당되는 값이 없다고 한다. 5번 규칙에 해당되는 내용이다.
age에 대한 값을 변수명을 통해 입력해주자.
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", age=20)
다시 실행해보자.
name=정우성
args=('01012341234', 'seoul')
age=20
제대로 출력되는것을 확인할 수 있다.
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")
위의 예제를 실행해보자.
File "main.py", line 1
def func_param_with_kwargs(name, age, **kwargs, address=0):
SyntaxError: invalid syntax
함수의 변수를 확인해보니 **변수가 3번째에 위치하고 있다. 3번 규칙에 해당되는 내용이다.
**kwargs를 수정해주도록 하자.
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")
다시 실행해보자.
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")
위의 예제를 실행해보자.
File "main.py", line 1
def mixed_params(name="아이유", *args, age, **kwargs, address):
SyntaxError: invalid syntax
**변수가 4번째에 위치하고 있다. 3번 규칙에 해당되는 내용이다.
**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(20, "정우성", "01012341234", "male" ,mobile="01012341234", address="seoul")
다시 실행해보자.
Traceback (most recent call last):
File "main.py", line 7, in
mixed_params(20, "정우성", "01012341234", "male" ,mobile="01012341234", address="seoul")
TypeError: mixed_params() missing 1 required keyword-only argument: 'age'
'age' 변수에 대한 내용이 없다고 한다. 5번에 해당되는 내용이다.
해결법은 두가지다. 함수의 'age' 변수를 'name'앞으로 옮기거나 함수사용시 'age'를 직접 호출하여 할당하는것이다.
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
제대로 출력되는것을 확인할 수 있다.
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(age = 20, "정우성", "01012341234", "male" ,mobile="01012341234", address="seoul")
다시 실행해보자.
File "main.py", line 7
mixed_params(age = 20, "정우성", "01012341234", "male" ,mobile="01012341234", address="seoul")
SyntaxError: positional argument follows keyword argument
'age'변수가 기본값 매개변수 앞에서 사용되어 에러가 생겼다. 4번 규칙에 해당되는 내용이다.
'address'변수 뒤로 옮겨주자.
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" ,mobile="01012341234", address="seoul", age = 20)
다시 실행해보자.
name=정우성
args=('01012341234', 'male')
age=20
kwargs={'mobile': '01012341234'}
address=seoul
제대로 출력되는것을 확인할 수 있다.