Keyword arguments

chromis·2022년 3월 7일
0

Python

목록 보기
2/3

Better way 23

키워드 인자로 선택적인 기능을 제공하라

3줄 요약

  1. **kwargs는 인자들을 딕셔너리로 모아 함수에 전달한다.
  2. 함수 호출 시 인자의 역할을 확실히 알 수 있도록 키워드 인자를 꼭 활용하자
  3. 키워드 인자를 통해 디폴트 값 지정이 가능하다

간단히 이해할 수 있는 부분!

# 키워드 인자 **kwargs

def remainder(number, divisor):
    return number % divisor

assert remainder(20, 7) == 6

# ok
remainder(20, 7)
remainder(20, divisor=7)
remainder(number=20, divisor=7) # 제일 보기 좋음!
remainder(divisor=7, number=20) # 제일 보기 좋음!

# error!
remainder(number=20, 7) # 키워드 인자가 앞에 있으면 오류!
remainder(20, number=7) # number 인자가 두 번 사용됨!

* <- asterisk

변수 위치 인자 (*args : arguments)는 튜플을 반환

키워드 인자 (**kwargs : Keyword arguments)는 딕셔너리를 반환

def foo(requires, *args, **kwargs) :
    print(requires)
    if args :
        print(args, type(args))
    if kwargs :
        print(kwargs, type(kwargs))

foo("hi", 5, a=5)

>>
hi
(5,) <class 'tuple'>
{'a': 5} <class 'dict'>

########################

# 딕셔너리에 있는 값을 각 값에 대응하는 키를 키워드로 사용하며 함수에 전달

def remainder(number, divisor):
    return number % divisor

my_kwargs = {
    'number': 20,
}

other_kwargs = {
    'divisor': 7,
}

# **kwargs 여러번 사용 가능 (겹치지 않는다면)
remainder(**my_kwargs, **other_kwargs)
>>
6

#######################

# 모든 키워드 인자를 받는 함수를 만들 시엔, **kwargs로 dict에 모아준다

def print_parameters(**kwargs):
    for key, value in kwargs.items():
        print(f'{key} = {value}')

print_parameters(alpha=1.5, beta=9, 감마=4)
>>
alpha = 1.5
beta = 9
감마 = 4

질문!

위의 foo 함수를 다음과 같이 호출하면 어떻게 될까?

def foo(requires, *args, **kwargs) :
    print(requires)
    if args :
        print(args, type(args))
    if kwargs :
        print(kwargs, type(kwargs))

foo("hi", 5, {'a':5})
  • 정답!
    >>
    hi
    (5, {'a': 5}) <class 'tuple'>
    # 튜플로 묶어버린다... 이걸 해결하려면
    
    foo("hi", 5, **{'a':5})
    >>
    hi
    (5,) <class 'tuple'>
    {'a': 5} <class 'dict'>

키워드 인자를 사용하는 이유?

1. 함수 호출의 의미를 명확히 알려줄 수 있음

remainder(20, 7) -> remainder(divisor=7, number=20)

2. 함수 정의 시 디폴트 값 지정 가능

WEIGHT_DIFF = 0.5
TIME_DIFF = 3

def flow_rate(weight_diff, time_diff, period=1): # period 디폴트 값 = 1
    return (weight_diff / time_diff) * period

flow_per_second = flow_rate(weight_diff, time_diff) # 생략시 period 디폴트 값 적용
flow_per_hour = flow_rate(weight_diff, time_diff, 3600) # OK
flow_per_hour = flow_rate(weight_diff, time_diff, period=3600) # 추천!

디폴트 인자 설명은 None과 독스트링으로 해결하자! (Better way 24)

3. 함수 파라미터를 확장할 수 있는 방법 제공

WEIGHT_DIFF = 0.5
TIME_DIFF = 3

def flow_rate(weight_diff, time_diff,
              period=1, units_per_kg=1): # units_per_kg 인자 추가
    return ((weight_diff * units_per_kg) / time_diff) * period

pounds_per_hour = flow_rate(weight_diff, time_diff,
                            period=3600, units_per_kg=2.2) # 추천
pounds_per_hour = flow_rate(weight_diff, time_diff, 3600, 2.2) # NOPE!

# 책에서는 선택적 인자를 사용 시 위치 인자를 *절대* 사용하지 말라고 함;;

명시적인 키워드 인자 스타일 코드를 사용하자! (Better way 25)

참고자료

파이썬의 키워드 인자 (keyword parameter)

Python 별표() 문법(asterisk/star syntax), args와 **kwargs

0개의 댓글