Python Keyword Arguments: 함수 인자에 이름을 붙여주세요

· by 박승재

파이썬에서는 함수를 호출할 때 함수의 인자에 이름을 붙여 전달할 수 있다.

이를 Keyword Arguments라 부른다.

이름을 붙여서 전달하는 인자는 인자의 순서에 구애받지 않고 값을 전달할 수 있으며 가독성을 향상시킨다.

기본

def print_abc(a, b=-1, c=-1):
    print(f'a: {a}')
    print(f'b: {b}')
    print(f'c: {c}')

인자로 받은 a, b, c를 출력하는 print_abc를 이용해 아래 예시를 보자.

print_abc(10, 20)

Output:

a: 10
b: 20
c: -1

위는 함수 정의 명시된 인자의 순서를 이용해 값을 전달하는 Positional Arguments 방식을 이용한 예제이다.

Keyword Arguments는 아래와 같이 인자의 순서를 무시하고 값을 전달할 수 있다.

print_abc(b=10, a=20)

Output:

a: 20
b: 10
c: -1

10이 20보다 앞에 있지만, 결과를 보면 순서에 상관없이 ab의 이름대로 값이 바뀐 것을 볼 수 있다.

또한, ab를 명시적으로 표시함으로써 코드를 볼 때 각 인자가 어떤 역할을 하는지 직관적으로 볼 수 있어 코드의 가독성을 높이는 데도 도움이 된다.

응용

Keyword Arguments는 함수 인자의 기본값을 활용할 때도 도움이 된다.

print_abc(10, c=20)

Output:

a: 10
b: -1
c: 20

c를 Keyword Arguments로 전달함으로써 b를 건너뛰고 값을 전달한다. 이때, b는 기본값인 -1이 할당된다.

가변인자 Keyword Arguments

Keyword Arguments 역시 인자의 개수가 정해지지 않은 가변인자로 사용할 수 있다.

def print_all(**kwargs):
    for key in kwargs:
        print(f'key: {key}, value: {kwargs[key]}')

print_all(a=1)
print_all(a=10, b=20)
print_all(q=-1, w=-2, e=-3)

Output:

key: a, value: 1
key: a, value: 10
key: b, value: 20
key: q, value: -1
key: w, value: -2
key: e, value: -3

위의 예제는 인자의 이름을 딕셔너리의 키(Key)로 값을 저장한 후, for-in을 이용해 딕셔너리의 값을 출력하는 예제이다.

여기서 *는 포인터의 의미가 아닌 kwargs여러 개의 인자를 받을 수 있는 집합이란 의미이다.

*args와 같이 *가 하나 있다면 Positional Arguments를 튜플(Tuple) 형태로 저장하고,

**kwargs와 같이 *가 2개라면 Keyword Arguments를 딕셔너리(Dictionary) 형태로 저장한다.

참고: 가변인자, 패킹, 언패킹

Keyword-Only Arguments

Keyword Arguments으로만 함수 인자를 전달할 수 있게 강제할 수도 있다.

함수 인자 자리에 *를 넣으면 된다.

def print_abcd(a, b=-1, *, c=-1, d=-1):
    print(f'a: {a}')
    print(f'b: {b}')
    print(f'c: {c}')
    print(f'd: {d}')


print_abcd(1, 2, c=3)

Output:

a: 1
b: 2
c: 3
d: -1

참고: Keyword-Only Arguments

주의사항

Keyword Arguments는 Positional Arguments 앞에 올 수 없다.

즉, 아래와 같은 코드는 오류가 발생한다.

print_abc(a=10, 20)

Output:

File ".\test.py", line 7
    print_abc(a=10, 20)
                    ^
SyntaxError: positional argument follows keyword argument