파이썬/파이썬(python) 중급

[27-4 파이썬] **kwargs(Many Keyworded Arguments)

Olivia-BlackCherry 2022. 9. 13. 18:25

* 는 아스테리스크이다.

 

**kwargs

는 키워드가변인자(many keyworded arguments)를 뜻한다.

가변인자를 사용하면

함수에 전달하고자 하는 값을 좀더 유연하게 작업할 수 있다.

 

kwargs는 keyworded arguments의 줄임말로 콹스라고 불린다.

단어는 내가 원하는 단어를 사용하면 된다. 

통상적으로 kwargs 또는 kw를 많이 슨다. 

 

 

 

우선,

kwargs는 딕셔너리 형태이다.

def calculate(**kwars):
    print(kwars)

calculate(add=3, multiply=5, subtract=2)

{'add': 3, 'multiply': 5, 'subtract': 2}

 

 

 

 

key, value를 하나씩 뽑아보면 아래와 같다.

def calculate(**kwargs):
    for key, value in kwargs.items():
        print(key)
        print(value)

calculate(add=3, multiply=5, subtract=2)

add
3
multiply
5
subtract
2

 

 

 

kwargs는 딕셔너리 타입이기 때문에 값을 가져올 때,

대괄호 메소드를 통해 값을 구해야 한다고 했다.

즉, kw["add"] 식으로 대괄호 안에 키를 입력해야 한다. 

def calculate(**kwargs):
    print(kwargs["add"])

calculate(add=3, multiply=5, subtract=2)

3

 

 

 

위치인수 + **kwargs 조합

def calculate(n, **kwargs):
    n += kwargs["add"]
    n *= kwargs["multiply"]
    n -= kwargs["subtract"]
    print(n)
    
calculate(4, add=3, multiply=5, subtract=2)

33

 

 

 

**kwargs를 가지고 클래스를 정의해보자.

**kwargs는 **kw라고 명명했다.

딕셔너리이므로, kwargs 딕셔너리의 key로 접근하여 value 값을 뽑았다.

 

단, 객체를 생성할 때

 school class에 있는 생성자 student, teacher, books 중 하나라도 빠진다면

에러가 나니 주의해야 한다.

class School:

    def __init__(self, **kw):
        self.student = kw["student"]
        self.teacher = kw["teacher"]
        self.books = kw["books"]

my_school = School(student="Mingyeong", teacher= "Olivia", books="coding")
print(my_school.student)

Mingeong

 

 

 

get()

하지만 좀더 간편한 방법이 있다.

바로 get함수를 이용하는 것이다. 

[ ] 메소드와 사용법은 매우 비슷하다.

 

하지만 get함수의 경우, 딕셔너리 안에 키가 존재하지 않을 때,

아무것도 반환하지 않지만(none), 오류도 발생시키지 않는 이점이 있다.

 

get 함수를 사용하면, 

많은 키워드 인수를 갖는 클래스에서

모든 키워드인자를 입력하지 않고도 객체를 만들어낼 수 있게 된다.

이로써

매우 매우 효율적인 코드가 된다!

class School:

    def __init__(self, **kw):
        self.student = kw.get("student")
        self.teacher = kw.get("teacher")
        self.books = kw.get("books")
        self.pencils = kw.get("pencils")
        self.desk = kw.get("desk")

my_school = School(student="Mingyeong", teacher= "Olivia")
print(my_school.books)

None