[Python] args & kwargs

ㅎㅎ·2021년 6월 11일
0

Python

목록 보기
25/27

📌 More Complex Function Parameters

자동차를 구매한다고 가정했을 때 , 자동차를 구매할때 기본 사양을 구매할 수 도 있고, 원하는 옵션을 추가해 구매할 수 있다. 만약 H 자동차의 옵션 종류만 100개라고 할때, 모든 옵션을 넣는다면 함수의 정의 부분이 길어질 것이다.
또한 옵션은 계속 업데이트되므로 옵션이 새로 생길수고, 기존의 옵션이 사라질 수도 있다. 그렇다면 기존에 정의된 함수를 바꿔야하기 때문에 매우매우 비효율적이다.

따라서 사전에 정확히 필요한 파라미터 수와 구조를 알수 없는 경우는 어떻게 해야할까?

가장 간단한 방법은 딕셔너리를 파라미터로 받아서 사용한다.

def buy_car(options):
    print(f"손님 어떤 제품을 원하십니까? :")

    for option in options:  # 키값 돌기 
        print(f"{option} : {options[option]}") # 키  : 밸류를 하나씩 출력

options = {"seat" : "가죽", "blackbox" : "최신"}

buy_car(options)

# 결과 
손님 어떤 제품을 원하십니까? :
seat : 가죽
blackbox : 최신

하지만 이렇게 하면 원하는 옵션만 간단하게 설정할 수 있다는 장점는 반면 옵션을 딕셔너리로 받아야한다는 제약이 있다. 또한 딕셔너리가 아닌 다른 타입의 값이 들어가면 오류가 생길 가능성도 있다.

이때 사용하는 것이 *args이다

- **kwargs

  • keyworded variable length of arguments
  • 이를 사용하기 위해서는 이름 앞에 **를 붙인다. ex) *options 하지만 이름을 일반적으로 kwargs라고 짓기때문에 **kwargs 라고 파라미터 이름을 정한다.

keyworded variable length of arguments 와 일반적인 keyword arguments의 차이점

  • argument 수를 0 ~ N 까지 유동적으로 넘겨준다.
  • 키워드가 미리 정해져 있지 않기 때문에 원하는 키워드를 유동적으로 사용할 수 있다.
  • 딕셔너리 형태로 함수에 전달된다!!

따라서 위의 예시를 **kwargs를 사용해 수정한다면 다음과 같이 바꿀 수 있다.

def buy_car(**kwargs):
    print(f"손님 어떤 제품을 원하십니까? :")

    for option in kwargs:  # 키값 돌기 
        print(f"{option} : {kwargs[option]}") # 키  : 밸류를 하나씩 출력

buy_car(seat="가죽", blackbox="최신", tint="yes") # 원하는 옵션들만 써서 보내기  

# {seat="가죽", blackbox="최신", tint="yes"} 이런 형태로 함수안에 들어감 (= 딕셔너리)

- *args

  • Non-keyworded variable length of arguments ( variable length of arguments 라고도 함)
  • 이는 위의 keyworded variable length of arguments와 동일하지만, 키워드를 사용하지 않고 순서대로 값을 전달한다는 방식에서 차이가 있다.
  • 사용하는 방법은 이름 앞에 *를 붙여서 선언한다.
  • 그리고 튜플로 변환되어 함수에 전달된다.

- *args and **kwargs

두 arguments를 둘다 사용해 함수를 정의할 수 도 있다.

def do_something(*args, **kwargs):
     ## some code here...
     ....

➡️ 이렇게 둘다 사용하면 어떠한 형태와 수의 argument도 허용 가능한 함수가 된다.

0개의 댓글