[Effective Python] BW 23. 키워드 인자로 선택적인 기능을 제공하라

전민수·2023년 5월 25일
0

EffectivePython

목록 보기
5/10

argument & parameter

이미지 출처-모던 자바스크립트 Deep dive
출처-모던 자바스크립트 Deep dive

1) parameter = 인자 = 매개변수

인자는 함수 정의부에 함수 내부에서 사용할 변수들의 이름을 선언한 것

2) argument = 인수

인수는 함수 호출부에서 함수를 호출할 때, 함수 내부로 넘겨주는 값


인자, 인수는 번역에 따라 상이함. 참고, MDN의 번역에서는 argument = 인수로 번역됨.

키워드 인수(keyword argument)

함수를 호출할 때 인수 뿐만 아니라 매개변수의 이름까지 명시적으로 지정해서 전달하는 방법입니다.

즉 함수 호출부에서 인수 부분에 매개변수의 이름을 함께 써서 전달하는 함수 호출 방법입니다.

def root_formula(a, b, c):
	return (-b + (b**2 - 4*a*c)**0.5) / 2*a, (-b - (b**2 - 4*a*c)**0.5) / 2*a
    
assert root_formula(1,2,1) == (-1, -1)

assert root_formula(a=1, b=2, c=1) == (-1, -1)

이 때, 인수가 모두 키워드로 제공되는 한, 인수의 순서는 상관없습니다.

단, 그렇지 않고 키워드 인수와 위치기반 인수가 겸용되면, 위치기반 인수가 키워드 인수보다 앞서 등장해야 합니다.

root_formula(a=1, 2, 1)

>>> Traceback
SyntaxError : positional argument follows keyword argument

'**' 연산자

  • ** 연산자를 활용하면 딕셔너리를 이용하여 함수에 매개변수를 전달할 수 있습니다.
    딕셔너리에 (key = parameter) : (value = argument value) 형식으로 item을 정의합니다.
    my_kwargs = {
        'a' = 1
        'b' = 2
        'c' = 1
    }
    이 딕셔너리를 **연산자를 이용해 함수 인수로 넘깁니다.
    assert root_formula(**my kwargs) == (-1, -1)
  • 이를 응용하여 위치인수나 키워드인수와 섞어서 함수를 호출할 수 있습니다. 단, 중복 인수는 없어야 합니다.
    my_kwargs = {
        'b' = 2
        'c' = 1
    }
    assert root_formula(a=1, **my_kwargs) == (-1, -1)
  • ** 연산자를 여러번 사용할 수 있습니다.
    my_kwargs = {
        'a' = 1
    }
    other_kwargs = {
        'b' = 2
        'c' = 1
    }
    assert root_formula(**my_kwargs, **other_kwargs) == (-1, -1)
  • 이를 매겨변수 부분에 적용하여 아무 키워드 인수나 받는 함수를 만들 수 있습니다.
    def print_parameters(**kwargs):
    	for key, value in kwargs.items():
      	print(f'{key} = {value}')
          
    print_parameters(alpha=1.5, beta=9, 감마=4) # 한글 parameter도 잘 작동됨.
    이는 인수들을 kwargs라는 딕셔너리로 병합하여 함수 내에서 사용한다고 볼 수 있습니다.

장점

keyward argument로 함수를 호출하는 것의 장점은 다음과 같습니다.

  1. 코드를 읽는 사람들에게 함수 호출의 의미를 명확히 알려줄 수 있습니다. 인수가 함수 내에서 어떤 역할을 하는지 함수 호출부만 보고도 알 수 있습니다.

  2. 함수 정의에서 디폴트 값을 지정할 수 있습니다. 이로 인해 코드중복과 시각적 잡음이 줄어듭니다.

  3. 기존 호출자에게는 하위호환성1(backward compatibility)을 제공하면서 함수 매개변수를 확장할 수 있는 방법을 제공합니다. 이로 인해 기존 코드를 별도로 마이그레이션2(migration)하지 않아도 기능을 추가할 수 있습니다. 이는 새로운 버그가 생길 여지를 줄어듦을 의미합니다.

    1. 하위 호환성(backward compatibility) :
    새 기기 또는 소프트웨어를 개발할 때, 이전 기종 또는 OS로도 문제 없이 제대로 실행되는 것

    2. 마이그레이션(migration) :
    데이터나 소프트웨어를 한 시스템에서 다른 시스템으로 이동하는 것

profile
Learning Mate

0개의 댓글