위치 인자(가변 인자(varargs), 스타인자(star args)
함수의 호출이 깔끔해진다.
시각적 잡음이 줄어든다.
활용 예시
#기존: 코드의 잡음이 많다.
def log(message, values):
if not values:
print(message)
else:
values_str = ','.join(str(x) for x in values)
print(f'{message}: {values_str}')
log('내 숫자는', [1,2])
log('안녕', [])
#스타인자 활용: 빈리스트 버리기
def log(message, *values):
if not values:
print(message)
else:
values_str = ','.join(str(x) for x in values)
print(f'{message}: {values_str}')
log('내 숫자는', 1,2)
log('안녕')
가변적인 위치 인자의 단점
선택적인 위치 인자가 함수에 전달되기 전에 항상 튜플로 변환
함수를 호출하는 쪽에서 제너레이터 앞에 * 연산자를 사용하여 모든 원소를 얻기 위해 반복
메모리 소모가 심해진다.
def my_generator():
for i in range(10):
yield i
def my_func(*args):
print(args)
it = my_generator()
my_func(*it)
#(0,1,2,3,4,5,6,7,8,9)
위의 코드 방식을 쓸 때
가변적인 위치 인자의 단점 2
함수에 새로운 위치 인자를 추가하면 해당 함수를 호출하는 모든 코드 변경
이미 가변인자가 존재하는 함수 인자 목록의 앞부분에 위치 인자 추가 시도
기존 호출코드를 변경하지 않았다면 미묘하게 깨질 수 있다.
위외 같은 이유로 버그 추적이 어렵기에 키워드 기반의 인자만을 사용하ㅓ나 타입 애너테이션을 활용
def log(sequence, message, *values):
if not values:
print(f'{sequence}-{message}')
else:
values_str = ','.join(str(x) for x in values)
print(f'{sequence} - {message}: {values_str}')
log(1, '좋아하는 숫자는', 7,33)#새코드에서 사용, 문제없음
log(1, '안녕') #메세지만 사용 문제 없음
log('좋아하는 숫자는',7,33) #예전방식 코드 깨짐