시각적인 잡음줄이기

매일 공부(ML)·2022년 6월 13일
0

이어드림

목록 보기
74/146

변수 위치 인자를 사용해 시각적인 잡음을 줄여라

위치 인자(가변 인자(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) #예전방식 코드 깨짐
profile
성장을 도울 아카이빙 블로그

0개의 댓글