Python에 Typer와pytest:Type 프롬프트가 있는 명령줄 도구가 유용합니다.
프롬프트 입력
파이톤의 명령행 조수 라이브러리 (예 argparse 와 Click 에서 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.scripts
에 pyproject.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"
현재run
는 greet
명령이 가리키는 함수이지 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
를 사용하여 위 작업을 실행합니다.시험에 통과했습니까?
행복
대안 및 추가 읽기
명령행 도구를 구축할 때 파이톤은 논리에 맞는 선택이기 때문에 이 과정을 간소화하는 많은 옵션이 존재하는 것도 이상할 게 없다.
sys.argv
를 통해 당신의 명령행 파라미터를 해석할 수 있습니다.Reference
이 문제에 관하여(Python에 Typer와pytest:Type 프롬프트가 있는 명령줄 도구가 유용합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/bowmanjd/command-line-tools-in-python-with-typer-and-pytest-type-hints-are-useful-khg텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)