어떻게python 프로젝트를 완벽하게 구축합니까

8703 단어 python 프로젝트
다음에python 튜토리얼 코너가 여러분을 위해 완벽한python 프로젝트를 구축할 수 있습니다. 여러분을 도와 함께 진보를 토론할 수 있기를 바랍니다.
새로운 Python 프로젝트를 시작할 때, 모두들 쉽게 머리를 묶고 인코딩을 시작한다.사실 약간의 시간을 들여 우수한 라이브러리를 선택하면 앞으로의 개발에 많은 시간을 절약하고 더욱 즐거운 인코딩 체험을 가져다 줄 것이다.
이상적인 세계에서 모든 개발자의 관계는 상호 의존과 관련(협업 개발)이다. 코드는 완벽한 형식이 있어야 하고 저급한 오류가 없으며 테스트가 모든 코드를 덮어씌워야 한다.또 이 모든 것은 제출할 때마다 보증을 받을 수 있다.(코드 스타일 통일, 유형 검사, 테스트 커버율 높음, 자동 검사)
본고에서 나는 어떻게 이런 점을 할 수 있는 프로젝트를 세울 것인가를 소개할 것이다.절차에 따라 조작할 수도 있고, 쿠키커터를 사용하여 프로젝트 생성 부분으로 바로 이동할 수도 있습니다.
먼저 새 프로젝트 디렉터리를 만듭니다.

mkdir best_practices
cd best_practices
pipx Python 타사 라이브러리 설치 명령행 도구
Pipx는 Python 타사 라이브러리를 신속하게 설치하는 데 사용할 수 있는 명령행 도구입니다.우리는 그것을 사용하여 pipenv와 쿠키커터를 설치할 것이다.다음 명령을 통해 pipx를 설치합니다.

python3 -m pip install --user pipx
python3 -m pipx ensurepath
pipenv를 사용하여 의존 관리
Pipenv는 프로젝트에 대해virtualenv(가상 환경)를 자동으로 만들고 관리하며 패키지를 설치/마운트 해제할 때 Pipfile에서 패키지를 추가/삭제합니다.또한 매우 중요한 Pipfile을 생성합니다.lock은 의존적인 신뢰성을 확보하는 데 사용됩니다.
당신과 당신의 동료가 같은 라이브러리 버전을 사용하고 있다는 것을 알게 되면 프로그래밍의 자신감과 즐거움을 크게 높일 수 있습니다.Pipenv는 같은 라이브러리를 사용하고 버전이 다른 이 문제를 잘 해결했습니다. Pipenv는 과거 한동안 광범위한 관심과 인정을 받았기 때문에 안심하고 사용할 수 있습니다.설치 명령은 다음과 같습니다.

pipx install pipenv
black과 isort를 사용하여 코드 포맷
black은 우리의 코드를 포맷할 수 있습니다.
Black은 비타협적인 Python 코드 포맷 라이브러리입니다.그것을 사용하면 코드 형식의 세부 사항을 수동으로 조정하는 것을 포기할 것입니다.보답으로 블랙은 속도, 확정성, 파이썬 코드 스타일 조정에 대한 고민을 피하고 더 많은 정력과 시간을 더 중요한 일에 쏟을 수 있다.
어떤 항목을 읽고 있든지 간에 블랙으로 포맷된 코드는 보기에 많지 않다.한동안 격식은 더 이상 문제가 되지 않는다. 그러면 너는 내용에 더욱 집중할 수 있다.
black은 코드의 차이성을 줄여 코드 검사를 더욱 빠르게 합니다.
isort는 우리의 imports 부분을 정렬합니다.
isort는 가져온 Python 패키지 부분(imports)을 정렬하기 때문에 imports를 수동으로 정렬할 필요가 없습니다.가져오기를 알파벳순으로 정렬하고 자동으로 여러 부분으로 분할할 수 있습니다.
pipenv를 사용하여 배포가 혼란스럽지 않도록 설치합니다. (개발 환경에서만 설치할 수 있도록 지정할 수 있습니다.)

pipenv install black isort --dev
Black과 isort는 호환되지 않는 기본 옵션이기 때문에 isort는 Black의 원칙을 따르도록 하겠습니다.setup을 만듭니다.cfg 파일과 다음 구성을 추가합니다.

[isort]
multi_line_output=3
include_trailing_comma=True
force_grid_wrap=0
use_parentheses=True
line_length=88
다음 명령을 사용하여 이 도구를 실행할 수 있습니다.

pipenv run black
pipenv run isort
flake8을 사용하여 코드 스타일 보장
Flake8은 코드가 PEP8에 정의된 표준 Python 코드 규범을 준수하는지 확인합니다.pipenv를 사용하여 설치:

pipenv install flake8 --dev
isort처럼 블랙과 잘 어울려 사용할 수 있도록 설정이 필요합니다.이 설정을 설정에 추가합니다.cfg :

[flake8]
ignore = E203, E266, E501, W503
max-line-length = 88
max-complexity = 18
select = B,C,E,F,W,T4
이제 flake8을 실행할 수 있습니다. 명령:pipenvrunflake8.
mypy로 정적 형식 검사
Mypy는 Python의 비강제적인 정적 유형 검사기로서 동적 (또는 오리) 유형과 정적 유형의 장점을 결합시키기 위한 것입니다.Mypy는 Python의 표현력과 편의성을 기능이 강한 유형 시스템의 컴파일 시 유형 검사와 결합시켜 모든 Python VM을 사용하여 실행합니다. 기본적으로 실행 시 비용이 없습니다.
Python에서 유형을 사용하는 데는 약간의 시간이 필요하지만 좋은 점은 크다.다음과 같습니다.

  • 정적 유형은 프로그램을 더욱 쉽게 이해하고 유지할 수 있다

  • 정적 형식은 오류를 더 일찍 발견하고 테스트와 디버깅 시간을 줄일 수 있습니다

  • 정적 유형은 코드가 생산에 들어가기 전에 발견하기 어려운 오류를 발견하는 데 도움을 줄 수 있습니다
  • 
    pipenv install mypy --dev
    기본적으로 Mypy는 가져온 패키지의 모든 형식 주석을 검사합니다. 라이브러리에 이 주석이 포함되지 않으면 오류가 발생합니다.mypy를 코드에서만 실행되도록 설정하고 형식 설명이 없는 가져오기 오류를 무시해야 합니다.우리는 우리의 코드가 아래 설정의 best_에 있다고 가정한다practices 패키지에 있습니다.이것을 setup에 추가합니다.cfg :
    
    [mypy]
    files=best_practices,test
    ignore_missing_imports=true
    이제 mypy를 실행할 수 있습니다.
    
    pipenv run mypy
    이것은 유용한 메모장이다.
    pytest와pytest-cov로 테스트를 진행합니다.
    pytest를 사용하여 테스트를 작성하는 것은 매우 쉽습니다. 테스트를 작성하는 저항을 없애면 더 많은 테스트를 신속하게 작성할 수 있습니다!
    
    pipenv install pytest pytest-cov --dev
    
      pytest  :
    # content of test_sample.py
    def inc(x):
        return x + 1
    def test_answer():
        assert inc(3) == 5
    그것을 실행하려면:
    
    $ pipenv run pytest
    =========================== test session starts ============================
    platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y
    cachedir: $PYTHON_PREFIX/.pytest_cache
    rootdir: $REGENDOC_TMPDIR
    collected 1 item
    test_sample.py F                                                     [100%]
    ================================= FAILURES =================================
    _______________________________ test_answer ________________________________
        def test_answer():
    >       assert inc(3) == 5
    E       assert 4 == 5
    E        +  where 4 = inc(3)
    test_sample.py:6: AssertionError
    우리의 모든 테스트 코드는test 디렉터리에 놓여 있기 때문에 이 디렉터리를setup에 추가하십시오.cfg :
    
    [tool:pytest]
    testpaths=test
    테스트 덮어쓰기를 더 보고 싶으면새 파일을 만듭니다.coveragerc, 프로젝트 코드만 되돌려주는 덮어쓰기 통계 정보를 지정합니다.예제 best_practices 항목, 설정은 다음과 같습니다.
    
    [run]
    source = best_practices
    [report]
    exclude_lines =
        # Have to re-enable the standard pragma
        pragma: no cover
        # Don't complain about missing debug-only code:
        def __repr__
        if self\.debug
        # Don't complain if tests don't hit defensive assertion code:
        raise AssertionError
        raise NotImplementedError
        # Don't complain if non-runnable code isn't run:
        if 0:
        if __name__ == .__main__.:
    이제 테스트를 실행하고 커버율을 볼 수 있습니다.
    
    pipenv run pytest --cov --cov-fail-under=100
    --cov-fail-under=100은 설정된 항목의 테스트 범위가 100%보다 작으면 실패로 인정됩니다.
    pre-commit의 Git hooks.
    Git hooks를 사용하면 스크립트를 제출하거나 푸시할 때 언제든지 실행할 수 있습니다.이것은 우리가 제출/전송할 때마다 모든 검사와 테스트를 자동으로 실행할 수 있게 한다.pre-commit은 이 훅들을 쉽게 설정할 수 있습니다.
    Githook 스크립트는 코드 심사를 제출하기 전에 간단한 문제를 식별하는 데 유용하다.우리는 코드의 문제점을 자동으로 지적하기 위해 제출할 때마다hooks를 실행합니다. 예를 들어 번호가 부족하고 공백과 디버깅 문장이 뒤따릅니다.코드 리뷰에 앞서 이러한 문제점을 지적함으로써 코드 심사자는 변경된 코드 내용에 전념할 수 있고 이런 자질구레한 스타일 문제를 처리하는 데 시간을 낭비하지 않을 수 있다.
    여기서, 우리는 상술한 모든 도구를 Python 코드 변경 사항을 제출할 때 실행하고, 푸시할 때만pytestcoverage를 실행하도록 설정합니다. (테스트는 마지막 단계이기 때문입니다.)새 파일을 만듭니다.pre-commit-config.yaml, 구성은 다음과 같습니다.
    
    repos:
      - repo: local
        hooks:
          - id: isort
            name: isort
            stages: [commit]
            language: system
            entry: pipenv run isort
            types: [python]
          - id: black
            name: black
            stages: [commit]
            language: system
            entry: pipenv run black
            types: [python]
          - id: flake8
            name: flake8
            stages: [commit]
            language: system
            entry: pipenv run flake8
            types: [python]
            exclude: setup.py
          - id: mypy
            name: mypy
            stages: [commit]
            language: system
            entry: pipenv run mypy
            types: [python]
            pass_filenames: false
          - id: pytest
            name: pytest
            stages: [commit]
            language: system
            entry: pipenv run pytest
            types: [python]
          - id: pytest-cov
            name: pytest
            stages: [push]
            language: system
            entry: pipenv run pytest --cov --cov-fail-under=100
            types: [python]
            pass_filenames: false
    이 hooks를 건너뛸 필요가 있으면gitcommit--no-verify 또는gitpush--no-verify를 실행할 수 있습니다
    쿠키커터를 사용하여 프로젝트 생성
    이제 이상적인 항목에 무엇이 포함되어 있는지 알았습니다. 템플릿으로 변환하여 하나의 명령으로 라이브러리와 구성을 포함하는 새로운 항목을 만들 수 있습니다.
    
    pipx run cookiecutter gh:sourcery-ai/python-best-practices-cookiecutter
    프로젝트 이름과 창고 이름을 입력하면 새 프로젝트를 생성합니다.
    설정을 완료하려면 다음 절차를 따르십시오.
    
    # Enter project directory
    cd <repo_name>
    # Initialise git repo
    git init
    # Install dependencies
    pipenv install --dev
    # Setup pre-commit and pre-push hooks
    pipenv run pre-commit install -t pre-commit
    pipenv run pre-commit install -t pre-push
    템플릿 항목에는 위의 도구를 사용해 볼 수 있는 매우 간단한 Python 파일과 테스트가 포함되어 있습니다.코드를 작성하고 문제가 없다고 생각되면 첫 번째gitcommit를 실행할 수 있습니다. 모든 hooks가 실행됩니다.
    편집기에 통합
    제출할 때 프로젝트의 코드가 시종 최고 수준을 유지하고 있다는 것을 알게 된 것은 흥분되는 일이다.그러나 코드가 모두 수정된 후에 (제출할 때) 문제가 있다는 것을 발견하면 기분 나쁠 것이다.그래서 실시간으로 문제를 드러내는 것이 훨씬 낫다.
    파일을 저장할 때 코드 편집기가 명령을 실행하는지 확인하는 데 시간이 좀 걸립니다.제때에 피드백이 있다는 것은 코드와 인상이 있을 때 도입된 모든 사소한 문제를 신속하게 해결할 수 있다는 것을 의미한다.
    개인적으로 이 작업을 수행하기 위해 뛰어난 Vim 플러그인을 사용합니다.

  • ale 실시간으로 flake8을 실행하고 파일을 저장할 때 블랙, isort, mypy 실행

  • projectionist와 통합된vim-test 파일 저장에pytest 실행
  • 이쯤에서python 프로젝트를 완벽하게 구축하는 방법에 대한 이 글은 여기까지 소개되었습니다. 더 많은 관련이python 프로젝트를 구축하는 내용은 저희 이전의 글을 검색하거나 아래의 관련 글을 계속 훑어보십시오. 앞으로 많은 응원 부탁드립니다!

    좋은 웹페이지 즐겨찾기