🖱️
Click — Python CLI 도구를 만드는 가장 깔끔한 방법
decorator 기반 CLI 프레임워크의 내부 동작
import click
@click.command()
@click.option('--name', '-n', required=True, help='Your name')
@click.option('--count', '-c', default=1, help='Number of greetings')
def hello(name, count):
for _ in range(count):
click.echo(f'Hello, {name}!')
hello() # CLI에서: python app.py --name Kim --count 3
argparse로 같은 걸 하면 코드가 3배 길어진다.
내부 동작
@click.command()는 함수를 Command 객체로 감싼다. @click.option()은 함수의 __click_params__ 리스트에 Option 객체를 추가한다.
hello()를 호출하면:
1. Command.main() 실행
2. sys.argv에서 인자를 파싱 (click.parser)
3. 파싱된 값을 함수 인자에 매핑
4. 타입 변환 + 검증 (int, float, Path 등)
5. 원본 함수(hello) 호출
Group으로 서브커맨드
@click.group()
def cli():
pass
@cli.command()
def init():
click.echo('Initialized')
@cli.command()
def deploy():
click.echo('Deployed')
python app.py init, python app.py deploy — git처럼 서브커맨드 구조. Click이 내부적으로 MultiCommand.invoke()로 서브커맨드를 라우팅한다.
Typer와의 관계
Typer(FastAPI 개발자가 만든)는 Click 위에 타입 힌트 레이어를 얹은 것이다. Click의 decorator 대신 함수 시그니처의 타입 힌트로 인자를 정의한다. FastAPI와 같은 철학.
핵심 포인트
1
@click.command()가 함수를 Command 객체로 감싼다
2
@click.option()이 __click_params__에 Option 객체를 추가
3
실행 시 sys.argv를 파싱 → 타입 변환 → 함수 호출
4
@click.group()으로 서브커맨드 구조 (git처럼 init, deploy 등)
사용 사례
CLI 도구 — 배포 스크립트, 데이터 파이프라인, 관리 명령
Django management command 대체 — Click이 더 깔끔한 경우