1 of 18

파이썬 command line tool

설계 및 개발론

2 of 18

내 용

  1. Command line interface(CLI) 패키지
    1. Argparse vs Click
    2. Entry points
  2. 대규모 CLI 시스템 디자인
    • Fail Fast, Fail Often
    • 디자인 패턴

3 of 18

Command line interface (CLI) 패키지

4 of 18

Argparse vs Click

  • 다양한 파이썬 CLI 패키지:
    • Optparse (Python 2.7까지만)
    • Argparse
    • Docopt
    • Click

5 of 18

Docopt

  • 3rd-Party 라이브러리
  • Docstring을 읽어 CLI 커맨드를 만들어줌.
  • 함수가 아닌 docstring으로 커맨드를 만들어야 함으로 docopt의 syntax를 배워야함.

http://docopt.org/

6 of 18

Argparse

  • Standard library
  • 기본 라이브러리인 이유로 많이 사용 됨.
  • 심플한 경우엔 편리하지만, 복잡한 CLI를 만들어야할 경우 사용하기 불편.

http://docopt.org/

7 of 18

Argparse

  • 모든 argparse 커맨드들이 한 위치에 모이게 되어 가독성이 떨어짐.

http://docopt.org/

8 of 18

Click

  • 함수 자체를 CLI로 형성.
  • Arguments와 option들은 decorator의 형태로 추가.
  • Subcommand들도 모두 개별 함수로 지정해서 사용.
  • 옵션들의 type checking이 잘 되어 있음.
  • setup.py의 entry points 기능과 관련하여 연결이 좀 더 직관적임.

9 of 18

Click

10 of 18

Click

  • Click 개발자가 직접 만든 18분짜리 데모 영상.

https://youtu.be/kNke39OZ2k0

11 of 18

setup.py

  • Entry points의 console_scripts를 통해 모듈의 함수를 CLI 함수로 지정.
    • mycommand -- 생성할 CLI 툴명
    • package.exe -- import될 모듈
    • cli -- import된 모듈 내 mycommand가 실행될 함수

12 of 18

setup.py

  • Entry points의 console_scripts를 통해 모듈의 함수를 CLI 함수로 지정.
    • mycommand -- 생성할 CLI 툴명
    • package.exe -- import될 모듈
    • cli -- import된 모듈 내 mycommand가 실행될 함수

13 of 18

Entry point

  • 알게 모르게 많은 파이썬 패키지들의 console_script가 설치되어 있음.

14 of 18

대규모 CLI 시스템 디자인

15 of 18

Fail Fast, Fail Often

  • 디버깅, 테스팅에 대한 best practice. 하지만 CLI의 구동에 대해서도 적용 가능.
  • 프로그램 내 문제 발생 여부를 미리 파악. 문제 가능성 확인 시 조기에 에러 발생
    • 프로그램 구동 전 dependencies 확인.
      • 오픈소스 툴들이 설치가 됐는지 확인.. R 라이브러리 빠진 건 없는지..
    • CLI 옵션 확인(Click!).
      • 존재하지 않은 디렉토리를 output directory로 지정한 건 아닌지..
      • 잘못된 변수 타입을 옵션으로 지정한 건 아닌지

16 of 18

디자인 패턴

  • Design patterns -- 소프트웨어 디자인의 주어진 맥락에서 일반적으로 발생하는 문제에 대한 일반적이고 재사용 가능한 솔루션.
    • Creational
      • Singleton, Factory 등등
    • Structural
      • Adaptor, Facade, Proxy 등등
    • Behavioural
    • Concurrency

17 of 18

Adaptor

  • 객체 간의 서로 다른 인터페이스를 맞추기 위한 adaptor
    • 파이썬의 @classmethod와 adaptor instance를 활용하여 개발.

18 of 18

Facade

  • Facade -- 정면
    • 사용자에게 복잡한 내부의 코드를 신경 안 쓸 수 있도록 간편한 인터페이스를 제공
    • “간편한 인터페이스"란, 소스 코드와 사용 방법 모두.
      • Click, Class 등등
    • 사용자를 위한 “간편한 인터페이스"의 필수 조건: good documentation