[TIL] Function parameters

이강일·2022년 1월 4일
0

함수 선언시 parameter 의 순서


def example(a, b, c=None, r="w", d = [], *args, **kwargs)

1. `a, b : positional parameter`

2. `c = none : optional parameter`

3. `r= "w" : keyword parameter`

4. `d = [] : list parameter`

5. `*args : keyword-only`

6. `**kwargs : var-keyword parameter`

함수를 정의할 때 default value parameter를  non-default value parameter 앞에 정의하면 안 되는 이유


  • non-default value parameter의 경우 값이 정해져 있지 않아도 기본적으로 keyword=value로 정의되어 있어서 parameter로 설정한 값과 받아오는 값의 순서만 일치하면 자유롭게 값을 받아 사용이 가능합니다.

  • 단점으로는

    • 논리적 오류를 발생시킬 가능성이 있습니다.

    • 인자에 어떤 타입이 들어오는지 파악이 어려워 코드의 가독성이 떨어집니다.
      default value parameter의 경우 함수 선언과 동시에 값이 정해지는 인자입니다.
      기본 값이 존재하는 인자를 받을 때 사용하며 코드의 중복을 줄이고 가독성을 높이기 위해 사용합니다. 값이 이미 존재해도 변경이 가능합니다.
  • 이러한 사항 때문에 default value parameternon-default value parameter보다 항상 뒤에 위치해야 되는 규칙을 지켜줘야 됩니다. 위 규칙을 어길 시 에러가 발생합니다. 만약 default value parameter, non-default parameter 형식으로 선언을 한 후 값을 하나만 보낸다면 어떤 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)
  • [ 어떤 에러가 발생했는지? ]

    missing 1 required keyword-only argument: age

  • [ 에러 수정 후 ]

    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)
  • 순차적으로 값을 읽어들이는데 non-default 값이 2개임과 동시에 중간에 위치하는 바람에 age인자를 어느 parameter에 넣어줘야 하는지 이해를 하지 못해서 에러를 발생시킵니다.
    위치 인수는 항상 가변 인수 앞에 위치해야 합니다.


가변 키워드 인수 위치에 따른 발생 에러 수정 전과 후


  • [ 에러 발생 ]
    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, 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”)
  • [ 어떤 에러가 발생했는지? ]

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

  • **kwargs 가 중간에 위치함에 따라 address(위치인수)와 **kwargs(가변키워드함수)의 순서가 바뀌면서 어느 parameter에 해당 값을 넣어줘야하는지 이해를 하지 못하고 에러를 발생시켰습니다.

위치 인수와 키워드 가변 키워드 인수 위치에 따른 수정 전과 후


  • [ 에러 발생 ]
    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")
  • [ 에러 수정 후 ]

    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")
  • [ 어떤 에러가 발생했는지? ]

    def mixed_params(name="아이유", *args, age, **kwargs, address):
    SyntaxError: invalid syntax

  • 인자들이 서로 어떠한 parameter 값과 대치를 해야 하는지 찾지 못하기 때문에 에러를 발생시킵니다. (keyword-only argument는 variable length keyword arguments 앞에 위치해야 합니다. position 인자인 age는 앞에 위치해야 합니다.)

0개의 댓글