-
Efficient Python 22. 변수위치 인자(*Args) 사용법뜯고 또 뜯어보는 컴퓨터/파이썬 (Python) 2021. 7. 30. 01:03반응형
- 파이썬 뿐 아니라 다른 언어에서도 함수의 위치인자(positional argument)를 가변적으로 받을 수 있으면, 함수 호출이 더욱 깔끔해진다.이를 가변인자(varargs)나 스타인자(star args)라고 부르기도 한다.
- 예를 들어 디버깅정보를 로그로 남기는 함수를 구현해볼때 인자수가 고정돼 있으면 메시지와 같이 list값을 받는 함수가 필요하다.
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("안녕",[])
더보기내숫자는: 1,2
안녕
- 이때, 빈 리스트를 넘기는 것은 코드에 잡음도 많고, 깔끔하지도 않기에 완전히 생략하면 좋을 것이다. 따라서, *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("안녕")
더보기내숫자는: 1,2
안녕
- 파이썬 에서 *연산자는 시퀀스의 원소들을 함수의 위치 인자로 넘길 것을 명령한다.
favorites = [7,33,99] log("좋아하는 숫자는", *favorites)
더보기좋아하는 숫자는: 7,33,99
- 하지만 *args 를 썻을때 치명적 단점 2가지가 있는데, 알아보자.
- 만약 제너레이터 앞에 *를 붙였을시, 함수를 지속적으로 불러와 memory leak 이 발생가능성이 농후하다.
- 인자를 추가하게 되었을 시, 함수 전체를 바꿔줘야 하는 부분이 생긴다.
# 제너레이터 앞에 *를 붙였을시 def my_generator(): for i in range(10): yield i def my_func(*args): print(args) it = my_generator() my_func(*it)
# 인자를 추가했을시, 함수 전체를 바꿔줘야 할때, 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("좋아하는 숫자는",7,33) # ---> 기존의 코드 양식은 깨지게 된다.
반응형'뜯고 또 뜯어보는 컴퓨터 > 파이썬 (Python)' 카테고리의 다른 글
Efficient python Ch24. 동적인 디폴트 인자 관리법 (0) 2021.07.31 Efficient Python 23. 키워드 인자 사용법 (0) 2021.07.30 Effective Python 21. 클로져란 (0) 2021.07.30 Effective python ch20. None보다는 예외를 (0) 2021.07.29