Python에 Typer와pytest:Type 프롬프트가 있는 명령줄 도구가 유용합니다.

Typer를 사용하면 Python으로 명령행 도구를 직관적이고 쉽게 작성할 수 있습니다.동시에 타자기는 충분한 유연성을 가지고 그것을 향해 던지는 복잡성을 처리할 수 있다.

프롬프트 입력


파이톤의 명령행 조수 라이브러리 (예 argparseClick 에서 Typer는 사용 type hints 에 있어 유일무이하다.
Python는 정적 형식 설명이 필요 없는 프로그래밍 언어이다.다시 말하면, 나는 my_variable = 2 을 쓸 수 있지만, 지정할 필요가 없다. my_variable 는 사실상 문자열이 아니라 정수이다.
선택할 수 있지만 파이톤은 정적 형식 알림을 지원합니다.다시 말하면, 나는 my_variable: int = 2 을 써서 my_variable 시종일관 정수여야 한다는 것을 암시할 수 있다.이거 어떻게 써요?이 도구mypy는 Python 모듈과 패키지에서 문제를 찾아내거나 문제가 없는지 확인할 수 있습니다.
최종 결과는 어떻습니까?작은 항목에서도 mypy와 유형 힌트가 코드에서 심각한 진단 문제를 초래할 수 있는 문제를 식별할 수 있다는 것이 인상적이었다.
형식 알림을 계속 작성하고 있다면, Typer 명령줄 인터페이스를 구축하는 것은 매우 의미가 있습니다.간단한 예를 하나 봅시다.

프로젝트 생성 및 모듈 추가


이 프로젝트를 관리하기 위해서 나는 시를 사용한다.Poetry는 파이톤 프로젝트와 의존항을 관리하는 성숙하고 현대화된 도구이다.너는 읽는 것을 좋아할 수도 있고, 프로젝트의 프로필도 좋아할 수도 있다.

You certainly don't need to use Poetry to construct and maintain a project. I do recommend treating your project as a Python package, and using virtual environments. Feel free to browse my . Regarding packaging a Python project the traditional way, using setup.py, not Poetry, you might like .


시로 이 프로젝트를 창작하려면 이와 같은 것이 가능해야 한다.
poetry new --name greet --src typergreet
cd typergreet
이 예에서 내부 패키지는 greet이지만 프로젝트 디렉터리는 typergreet입니다.
가방은 src 구조를 사용할 필요가 없지만 저는 그것을 사용합니다for reasons.
그런 다음 greet.py 하위 디렉토리에 다음과 같은 내용의 src/greet라는 파일을 추가합니다.
"""Send greetings."""

import time

import arrow  # type: ignore


def greet(tz: str, repeat: int = 1, interval: int = 3) -> None:
    """Parse a timezone and greet a location a number of times."""
    for i in range(repeat):
        if i > 0:  # no delay needed on first round
            time.sleep(interval)
        now = arrow.now(tz)
        friendly_time = now.format("h:mm a")
        seconds = now.format("s")
        location = tz.split("/")[-1].replace("_", " ")
        print(f"Hello, {location}!")
        print(f"The time is {friendly_time} and {seconds} seconds.\n")
각 함수 매개 변수의 유형 힌트와 반환 값을 주의하십시오.이 함수가 되돌아오지 않았기 때문에 (아쉽습니다!)반환 유형은 None입니다.

종속성 설치


우리는 arrow가 필요하고 Typer가 필요하므로 다음과 같이 추가해야 합니다.
poetry add arrow typer[all]
이것은 우리에게 모든 종소리와 호루라기 타자기를 더해 줄 화살표를 줄 것이다.컬러 출력과 케이스 검사가 필요하지 않으면 생략[all]할 수 있습니다.
우리는 유형 힌트를 사용하기 때문에 mypy도 필요하지만 개발 의존항으로 한다.poetry add의 경우 -D 플래그를 통해
poetry add -D mypy

유형 확인 프롬프트


올바른 유형의 프롬프트가 있는지 확인하고 코드가 이를 존중하는지 확인하려면 mypy:
poetry run mypy src/greet/greet.py
문제가 발견되지 않았습니까?걸출했어
이 가방을 가져올 때, 잠시 후에 테스트를 하더라도, 형식 암시라는 것을 알고 싶습니다.이렇게 하려면 패키지에 빈 파일py.typed을 생성합니다.이 점을 해낼 수 있는 방법은 매우 많다. (심지어 텍스트 편집기를 사용할 수도 있다.)Bash 및 Powershell에서 유효합니다.
echo "" | tee ./src/greet/py.typed

pyproject에 스크립트 끝점을 추가합니다.톰

greet 함수를 명령행 스크립트로 공개하려면 tool.poetry.scriptspyproject.toml 부분을 추가하십시오.
[tool.poetry.scripts]
greet = "greet.greet:greet"
설정greet(스크립트)greet(패키지)에서 greet(모듈)을 찾아서 사용greet(함수).만약 네가 명칭에 대해 더 많은 아이디어를 가지고 있다면 해라.
현재 스크립트가 설정되어 있습니다. 설치 패키지와 스크립트를 사용하십시오
poetry install
이제 새로 설치한 스크립트를 실행합니다.
$ poetry run greet
Traceback (most recent call last):
  File "<string>", line 1, in <module>
TypeError: greet() missing 1 required positional argument: 'tz'
실패는 공부로 가는 길이다.우리는 지금 공부하고 있다.

Typer를 사용하여 명령행 매개변수 분석


명령줄의 매개 변수를 해석하고 함수에 매개 변수로 전달하는 방법이 필요합니다.Typer 유형 힌트를 체크하고 명령행 매개변수와 옵션을 계산합니다.
Typer가 추가된 원래 기능은 다음과 같습니다.
"""Send greetings."""

import time

import arrow  # type: ignore
import typer

app = typer.Typer()


@app.command()
def greet(tz: str, repeat: int = 1, interval: int = 3) -> None:
    """Parse a timezone and greet a location a number of times."""
    for i in range(repeat):
        if i > 0:  # no delay needed on first round
            time.sleep(interval)
        now = arrow.now(tz)
        friendly_time = now.format("h:mm a")
        seconds = now.format("s")
        location = tz.split("/")[-1].replace("_", " ")
        print(f"Hello, {location}!")
        print(f"The time is {friendly_time} and {seconds} seconds.\n")


def run() -> None:
    """Run commands."""
    app()
무슨 변화가 생겼습니까?우리는 app = typer.Typer()로 전 세계적으로 Typer 응용 프로그램을 실례화했다.이렇게 하면, 우리는 명령줄에서 호출하고자 하는 모든 함수를 @app.command()decorator로 수식할 수 있다.
그리고 Typer 프로그램을 실행하기 위해 명령 실행 프로그램을 추가해야 합니다.이것이 바로 run() 함수의 작용이다.
스크립트 입구점을 greet 에서 run 로 변경한 것을 감안하면, 이것은 pyproject.toml 에서 분명히 밝혀져야 한다.따라서 다음과 같은 변경이 필요합니다.
[tool.poetry.scripts]
greet = "greet.greet:run"
현재rungreet 명령이 가리키는 함수이지 greet가 아니다.
이 모든 것이 준비된 후, 우리는 일하는 명령행 인터페이스가 생겼다.
$ poetry run greet --help
Usage: greet [OPTIONS] TZ

  Parse a timezone and greet a location a number of times.

Arguments:
  TZ  [required]

Options:
  --repeat INTEGER      [default: 1]
  --interval INTEGER    [default: 3]
  --install-completion  Install completion for the current shell.
  --show-completion     Show completion for the current shell, to copy it or
                        customize the installation.

  --help                Show this message and exit.
$
$ poetry run greet --repeat 2 --interval 1 Africa/Johannesburg
Hello, Johannesburg!
The time is 1:06 pm and 38 seconds.

Hello, Johannesburg!
The time is 1:06 pm and 39 seconds.
우리의 명령행 도구가 얼마나 예의 바르고 정보가 얼마나 빠른가.
참고: Typer에서 기본적으로 추가하는 추가 기능은 --help입니다. 매개변수와 옵션에 대한 자세한 설명과 사용자가 필요로 하는 셸 보완 기능을 추가합니다.

pytest로 Typer 인터페이스 테스트


테스트 명령행 인터페이스는 약간의 창조력을 필요로 한다.다행히도 Typer는 테스트용 명령행 실행 프로그램 CliRunner 을 제공했다.익숙하다면Click Click의 CliRunner와 매우 비슷합니다.(이것은 이상하지 않다. 클릭은 타자기의 의존이기 때문이다.)
다음 내용을 파일에 넣기tests/test_greet.py
from typer.testing import CliRunner

from greet.greet import app


def test_greet_cli():
    runner = CliRunner()
    result = runner.invoke(app, ["Europe/Madrid"])
    assert result.exit_code == 0
    assert "Hello, Madrid!" in result.output
poetry run pytest를 사용하여 위 작업을 실행합니다.
시험에 통과했습니까?
행복

대안 및 추가 읽기


명령행 도구를 구축할 때 파이톤은 논리에 맞는 선택이기 때문에 이 과정을 간소화하는 많은 옵션이 존재하는 것도 이상할 게 없다.
  • 는 앞에서 언급한 바와 같이 list provided by sys.argv 를 통해 당신의 명령행 파라미터를 해석할 수 있습니다.
  • 그러나 파이톤 표준 라이브러리argparse는 더 좋은 기능, 단순성과 효율을 제공했다.나는 이 문장과 매우 비슷한 문장을 한 편 썼다.
  • 다음 명령줄 라이브러리에 대해서도 간략하게 설명했습니다.


  • 나는 PlumbumCleo의 호평을 들은 적이 있지만 아직 시도해 본 적이 없다
  • 명령행 인터페이스를 정의하는 완전히 다른 방법을 이해하려면 docopt를 시도하십시오.docstring에서 인터페이스를 정의합니다.그러나 자주 유지보수되지는 않는다there is a docopt-ng fork.
  • 명령을 즐겨라!

    좋은 웹페이지 즐겨찾기