TIL - Python function 정의할 때 지켜야하는 argument 순서

박지훈·2022년 3월 3일
0

Python

목록 보기
2/5

1-1. function parameter에서 arguments를 처리하는 순서

  1. positional(non-default) arguments
  2. default arguments
  3. variable length positional arguments (=*arg)
  4. keyword-only arguments 4-1. non-default keyword-only
  5. arguments 4-2. default keyword-only arguments
  6. variable length keyword arguments (=**kwargs)

1-2. default value parameter를 non-default value parameter 앞에 정의 하면 안 되는 이유?

3~6번의 경우, 값을 2개 이상 받는 parameter들이 있어서 직관적으로 순서를 정해야하는 게 이해됐지만, 1,2번의 경우 처음엔 순서대로 알아서 들어가면 되지않나..? 라고 생각했다.

하지만 default value parameter라고 할지라도, 값을 새로 지정해주면 변경된 값으로 출력되는 게 가능하다.

그러므로, 3~6번의 경우와 같이 순서를 지정하지 않으면 어떤 값이 어떤 parameter에 들어가는 지 명확해지지 않기 때문에 정확한 순서에 맞게 정의해줘야 하는 것 같다.

아래는 예제들을 통해 배운 내용을 학습해 본 결과다.

에러 확인 후 수정 Q1.

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)

해당 코드를 실행하면 아래의 에러메세지가 출력된다.

    func_param_with_var_args("정우성", "01012341234", "seoul", 20)
TypeError: func_param_with_var_args() missing 1 required keyword-only argument: 'age'

*args에 "01012341234", "seoul", 20이 모두 할당되어 age에 할당되는 값이 없어보인다.

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

func_param_with_var_args("정우성", 20, "01012341234", "seoul", )

name=정우성
age=20
args=('01012341234', 'seoul')

1-1의 순서에 맞춰 다시 설정해주고 값이 정상적으로 출력되는 걸 확인!

Q2.

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")

해당 코드를 실행하면 아래의 에러메세지가 출력된다.

    def func_param_with_kwargs(name, age, **kwargs, address=0):
SyntaxError: invalid syntax

1-1의 순서를 참고해서 다시 정렬해줘서 오류를 해결할 수 있었다.

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

func_param_with_kwargs("정우성", "20", address="seoul", mobile="01012341234")

name=정우성
age=20
address=seoul
kwargs={'mobile': '01012341234'}

Q3.

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")

Q2와 같은 케이스로 1-1의 순서에 맞게 다시 수정해주었다.

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

0개의 댓글