Python Function Parameter

백승진·2020년 10월 22일
0

1. default value parameter를 non-default value parameter 앞에 정의 하면 안되는 이유에 대한 개인 의견.

  def registMember(sex='남자', name, age):
      print(sex)
      print(name)
      print(age)
      ...

  registMember('James', 32)  

위 코드기준으로 설명하면 default parameter가 앞쪽에 선언시 position으로 구분하는 함수 입장에선 'James'가 sex parameter의 argument인지, 아니면 name의 argument인지 구분할 방법이 없다. 이를 막기위해 파이썬에서 에러 대상으로 처리한 것으로 추정된다.

2. 위치 인수(positional arguments)와 가변 인수(variable length arguments) 주의 사항

    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'"라는 error 가 발생한다. 이는 args가 여러개의 값을 튜플형식으로 받는데 사용하는 parameter 로 함수 호출부에서 두번째(01012341234) 부터 마지막(20)를 args로 인식, 마지막 age는 찾지 못하는 문제가 발생하는 것이다. 이를 해결하려면 age parameter가 positional argument 처리가 되도록 선언 및 호출을 아래와 같이 변경해야 한다.

  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("정우성", 20, "01012341234", "seoul")

3. 가변 키워드 인수 (variable length keyword arguments) 주의 사항

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

위 코드 실행시 address parameter에 대한 SyntaxError: invalid syntax가 발생한다.
**kwargs는 키와값으로 구성되는 데이터들을 받는 parameter이다.
kwargs 순서부터 들어오는 키와값 구조의 데이터는 전부 kwargs에 들어가므로 그 뒤에 선언되는 단일 parameter는 사용할 수 없다. 이를 해결하려면 아래처럼 parameter 순서를 변경해야 한다.
그러면 호출과정에서 keyword argument 형식을 취하는 address는 address parameter로 인식이 된다.

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

4. 위치 인수와 키워드 가변 키워드 인수 (variable length keyword arguments) 주의 사항

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

위 코드는 다음 문제를 갖고 있다.

  • default parameter가 가장 앞선 순서에 정의됨(문제 1번 이슈)
  • age가 *args 다음순서의 parameter로 정의됨(문제 2번 이슈)
  • address가 **kwargs 다음순서의 parameter로 정의되고 호출시 keyword argument로
    처리되어 키값 데이터를 kwargs와 충돌된다(문제 3번 이슈)
  • 위 문제 해결을 위해 parameter 순서를 아래와 같이 변경
    def mixed_params(age, address, name="아이유", *args,  **kwargs):
        ....

    mixed_params(20, "seoul", "정우성", "01012341234", "male", mobile="01012341234")
profile
12년 .NET 개발 경력을 가진 웹 초짜 개발자입니다 :)

0개의 댓글