더북(TheBook)

BETTER WAY 18
가변 위치 인수로 깔끔하게 보이게 하자

 

 

선택적인 위치 인수(이런 파라미터의 이름을 관례적으로 *args라고 해서 종종 ‘star args’라고도 한다)를 받게 만들면 함수 호출을 더 명확하게 할 수 있고 보기에 방해가 되는 요소를 없앨 수 있다.

예를 들어 디버그 정보 몇 개를 로그로 남긴다고 해보자. 인수의 개수가 고정되어 있다면 메시지와 값 리스트를 받는 함수가 필요할 것이다.

def log(message, values):

if not values:

print(message)

else:

values_str = ‘, ‘.join(str(x) for x in values)

print(‘%s: %s’ % (message, values_str))

 

log(‘My numbers are’, [1, 2])

log(‘Hi there’, [])

 

>>>

My numbers are: 1, 2

Hi there

 

로그로 남길 값이 없을 때 빈 리스트를 넘겨야 한다는 건 불편하고 성가신 일이다. 두 번째 인수를 아예 남겨둔다면 더 좋을 것이다. 파이썬에서는 * 기호를 마지막 위치 파라미터 이름 앞에 붙이면 된다. 로그 메시지(log 함수의 message 인수)를 의미하는 첫 번째 파라미터는 필수지만, 다음에 나오는 위치 인수는 몇 개든 선택적이다. 함수 본문은 수정할 필요가 없고 호출하는 쪽만 수정해주면 된다.

def log(message, *values):    # 유일하게 다른 부분

if not values:

print(message)

else:

values_str = ‘, ‘.join(str(x) for x in values)

print(‘%s: %s’ % (message, values_str))

 

log(‘My numbers are’, 1, 2)

log(‘Hi there’)    # 훨씬 나음

 

>>>

My numbers are: 1, 2

Hi there

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.