7.1 함수 인자 모두 받기
Python에서는 함수 내부에서 전달된 모든 매개변수를 얻을 수 있는 몇 가지 아주 편리한 방법이 있어. 함께 살펴보자.
*args 사용하기
*args는 변수 개수의 위치(일반) 인자를 함수에 전달할 수 있게 해줘. 이 인자들은 튜플로 패킹되어 함수 내부에서 처리될 수 있어.
def print_numbers(*args):
for arg in args:
print(arg)
print_numbers(1, 2, 3, 4, 5)
설명
print_numbers 함수는 튜플 args에 패킹된 임의의 개수의 위치 인자를 받아. 우리는 for 루프를 사용해 함수 내부에서 인자들을 반복할 수 있어.
장점
- 유연성: 함수에 임의의 개수의 인자를 전달할 수 있어.
- 범용성: 매개변수 수가 불확실한 함수에 사용할 수 있어.
**kwargs 사용하기
**kwargs는 변수 개수의 이름이 있는 인자를 함수에 전달할 수 있게 해줘. 이 인자들은 딕셔너리로 패킹되어 함수 내부에서 처리될 수 있어.
def print_person_info(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
print_person_info(name="Alice", age=30, city="New York")
설명
print_person_info 함수는 딕셔너리 kwargs에 패킹된 임의의 수의 이름 있는 인자를 받아. 우리는 딕셔너리 메소드 items()를 사용해 함수 내부에서 인자들을 반복할 수 있어.
장점
- 유연성: 함수에 임의의 개수의 이름이 있는 인자를 전달할 수 있어.
- 가독성: 이름 있는 인자는 함수 호출을 더 읽기 쉽게 만들어줘.
7.2 인자의 타입 고정하기
오직 위치 인자
Python 3.8 이상에서는 오직 위치로만 전달할 수 있는 위치 인자를 가진 함수를 정의할 수 있어. 함수 정의에서 기호 /을 사용해 이걸 할 수 있어.
def greet(name, /, greeting="Hello"):
print(f"{greeting}, {name}!")
greet("Alice") # 출력: Hello, Alice!
greet("Alice", greeting="Hi") # 출력: Hi, Alice!
# greet(name="Alice") # 오류: TypeError
설명
greet 함수는 오직 위치로만 전달할 수 있는 인자 name을 받아. 인자들은 / 앞에 위치로만 전달될 수 있어.
이 방법은 인자 전달 방식을 제한하여, 가독성을 개선하고 오류를 방지할 수 있게 해줘.
오직 이름 있는 인자 (Keyword-Only Arguments)
오직 이름으로만 전달할 수 있는 함수 매개변수도 정의할 수 있어. 함수 정의에서 기호 *를 사용해 이걸 할 수 있어.
def greet(*, name, greeting="Hello"):
print(f"{greeting}, {name}!")
greet(name="Alice") # 출력: Hello, Alice!
greet(name="Alice", greeting="Hi") # 출력: Hi, Alice!
# greet("Alice") # 오류: TypeError
greet 함수는 오직 이름으로만 전달할 수 있는 인자 name을 받아. 인자들은 * 뒤에 이름으로만 전달될 수 있어.
이 방법은 인자 이름을 명시적으로 지정하게 강제하여 코드의 가독성을 개선해줘.
위치와 이름 있는 인자 결합하기
최대한의 유연성을 위해 위치와 이름 있는 인자를 결합할 수도 있어.
def greet(name, /, *, greeting="Hello"):
print(f"{greeting}, {name}!")
greet("Alice") # 출력: Hello, Alice!
greet("Alice", greeting="Hi") # 출력: Hi, Alice!
# greet(name="Alice") # 오류: TypeError
greet 함수는 오직 위치로만 전달할 수 있는 인자 name과 이름으로 반드시 전달해야 하는 인자 greeting을 가져. /와 *를 사용하면 위치와 이름 있는 인자를 결합할 수 있어.
세 가지 모든 상황의 전체 예제:
def full_example(a, b, /, c, d, *, e, f):
print(f"a={a}, b={b}, c={c}, d={d}, e={e}, f={f}")
# 다양한 인자와 같이 함수를 호출
full_example(1, 2, 3, 4, e=5, f=6) # 모든 인자가 올바르게 전달됨
# full_example(a=1, b=2, c=3, d=4, e=5, f=6) # 오류: TypeError
설명
- 오직 위치 인자:
a와b는 오직 위치로만 전달해야 해. - 일반 위치 또는 이름 있는 인자:
c와d는 위치로도 이름으로도 전달할 수 있어. - 오직 이름 있는 인자:
e와f는 오직 이름으로만 전달해야 해.
GO TO FULL VERSION