코드로 우주평화
Click _ argument, option으로 인자 전달하기 본문
Click 이란?
click은 커맨드 명령 환경에서 Python 스크립트에 인자를 넣을 수 있도록 도와주는 라이브러리이다.
예를 들어 하나의 스크립트가 날짜에 따라 동작이 달라져야 한다고 가정해보자. 우리는 이를 위해 날짜별로 스크립트를 만들어야 할까? 만약 그렇게 하면 매일 '오늘의 스크립트'를 새로 만들어야 할 것이다.
click은 이러한 문제를 쉽게 해결해준다. 스크립트에 날짜를 인자로 넣어 하나의 스크립트만으로 모든 날짜에 대한 동작을 수행할 수 있도록 도와주기 때문이다.
이번 글에서는 간단한 예시로 click 사용법을 익혀보자.
Click 사용법
1. 설치하기
pip install click
터미널에서 명령어로 click 패키지를 설치한다.
2. click 라이브러리 가져오기
# practice_click.py
import click
실행하려는 스크립트에 click을 Import 한다.
3. 기본 command 데코레이터 사용하기
@click.command()
def main () :
print( "가보자고!" )
main() # 스크립트 실행시 main함수 실행
함수를 작성하고 스크립트를 실행하면 “가보자고!”가 출력된다. 여기까지는 기존 스크립트와 동일하다.
4. argument 데코레이터로 DateTime 타입 받기
from datetime import datetime # type hint를 위해 불러옴
@click.command()
@click.argument("dt", type=click.DateTime(["%Y-%m-%d"]))
def main (dt: datetime) :
print( f" {dt. date()} 가보자고!" )
@click.argument 데코레이터를 추가했다. 이제 해당 스크립트는 "dt" 인자를 받을 수 있다.
데코레이터 안에 “dt”는 main함수의 dt 파라미터를 의미한다.
데코레이터 안에 “type”은 받은 인자를 datetime 타입으로 가져오는 것을 의미한다.
실행
>>> python practice_click.py 2020-08-08
2020-08-08 가보자고!
스크립트를 실행하면 위의 결과가 나온다. 실행 명령 오른쪽에 “dt”에 해당하는 인자를 넣으니 해당 스크립트가 인자를 올바르게 인식한다.
Usage: practice_click.py [OPTIONS] [%Y-%m-%d]
Try 'practice_click.py --help' for help.
Error: Missing argument '[%Y-%m-%d]'.
만약 인자를 넣지 않으면 '[%Y-%m-%d]' 형식의 argument가 필요하다는 에러가 발생한다. @click.argument 데코레이터의 경우 지정한 인자를 필수로 받기 때문이다.
5. argument 데코레이터로 Choice 선택지 받기
@click.command()
@click.argument("dt", type=click.DateTime(["%Y-%m-%d"]))
@click.argument("who", type=click.Choice(["혼자", "함께"]))
def main(dt: datetime, who: str):
print(f"{dt.date()}, {who} 가보자고!")
argument 데코레이터를 추가하였다.
이번에는 인자 이름이 ‘who’이다. main함수의 파라미터에도 명시하는 것을 잊지 말자.
type에는 Choice를 사용했다. Choice는 배열에 담긴 요소들 중에서만 인자를 받을 수 있음을 나타낸다.
실행
>>> python practice_click.py 2020-08-08 혼자
2020-08-08, 혼자 가보자고!
커맨드 명령으로 ‘2020-08-08’ 과 ‘혼자’ 두 개의 인자를 넣었다. 스크립트는 성공적으로 값을 출력했다.
>>> python practice_click.py 2020-08-08 엄마
Usage: practice_click.py [OPTIONS] [%Y-%m-%d] {혼자|함께}
Try 'practice_click.py --help' for help.
Error: Invalid value for '{혼자|함께}': '엄마' is not one of '혼자', '함께'.
만약 잘못된 값을 인자로 넣으면 선택지에 없다는 에러를 발생시킨다 🙂
6. option 데코레이터로 argument 대체하기
@click.command()
@click.option("--dt", required=True, type=click.DateTime(["%Y-%m-%d"]))
@click.option("--who", required=True, type=click.Choice(["혼자", "함께"]))
def main(dt: datetime, who: str):
print(f"{dt.date()}, {who} 가보자고!")
이번에는 @click.argument 대신 @click.option 데코레이터를 사용하였다.
option 데코레이터의 경우 인자를 필수로 받지 않기 때문에 필수로 받기 위해 'required=True'라는 옵션을 추가로 넣어주었다.
또한 인자 이름에도 dash를 붙여 '—dt', '—who'로 변경해주었다. (dash를 앞에 적음으로서 '—dt'가 실제 인자가 아닌 위치를 알려주는 인자임을 나타낸다)
실행
>>> python practice_click.py --dt 2020-08-08 --who 함께
2020-08-08, 함께 가보자고!
argument 데코레이터를 사용했을 때와의 차이점은 위치 인자인 '—dt', '—who'가 추가된 것이다.
보통 주입하려는 인자가 여러 개일 경우, 실무에서는 option을 더 많이 사용하는데 option의 경우 위치 인자를 통해 더 정확한 명령어를 입력할 수 있기 때문이 아닐까 싶다.
마무리
앞서보았듯 click을 사용하면 Python 스크립트에 인자를 주입할 수 있다. 이 글에서 설명한 것은 click의 일부분이므로 더 다양한 타입과 옵션을 커스텀하여 사용하고 싶다면 아래 공식문서를 참고하길 바란다.
'나는 이렇게 학습한다 > Library' 카테고리의 다른 글
파이썬으로 해외 증권거래소 개장일/휴장일 확인하는 방법 (0) | 2022.08.30 |
---|---|
Tenacity _ 예외가 발생한 함수를 다시 실행하려면? (0) | 2022.08.27 |
Black _ Code Formatter 회피하는 방법 (0) | 2022.08.19 |
python-dotenv _ 환경변수를 .env 파일로 관리하기 (0) | 2022.08.13 |
websockets _ Python 으로 비트코인 실시간 시세 가져오기 (feat. twelvedata) (1) | 2022.07.24 |