Python의 코드 포맷 자동화

20107 단어
당장, 우리 중요한 차이점을 분명히 합시다.유효한 코드를 작성하는 것과 작성한 코드를 작성하는 것은 전혀 다른 일이다.전자는 일종의 기능이고 후자는 일종의 예술 형식이다. 이런 차이는 위대한 프로그래머를 남다르게 한다.
우리가 좋은 코드를 이야기할 때, '좋아' 라는 단어는 디자인상 모호하다.코드의 좋고 나쁨에 관한 변함없는 규칙이 없기 때문이다.우리는 읽기 가능성과 같은 추상적인 지도 원칙만 가지고 있다.

Programs are meant to be read by humans and only incidentally for computers to execute.

– Abelson & Sussman


이것은 마성이공대학의 두 교수인데, 그들의 경력은 상당히 믿을 만하다.식별 코드의 질은 시간의 추이에 따라 실천과 경험을 통해 단련된 직감이다.코드 심사는 이 목표를 실현하는 데 큰 도움이 된다.
코드 심사는 하나의 과정이다. 이 과정에서 당신보다 경험이 많은 개발자가 당신의 코드를 통독하고 개선 제안을 해서 더욱 좋게 한다.이러한 건의들은 성능을 향상시키고 새로운 언어 기능을 추가하며 보안 결함을 보완하거나 코드 스타일을 바로잡을 수 있다.
... 코드 심사와 관련이 있을 때
하지만 수동 코드 심사는 비싸다.누군가가 당신의 코드를 읽는 데 걸린 시간은 그들이 훌륭한 것을 구축하는 데 쓰지 않은 것이다.그것들도 실수하기 쉬울 뿐만 아니라, 결코 전면적이지 않다.인류의 지식과 기억은 유한하다.
자동화에 들어가다.자동 코드 평가는 수동 코드 평가보다 빠르고 오류가 발생하기 쉬우며 깊이가 있다.
단일 Python 파일을 포함하는 예시 항목을 통해 이 과정을 깊이 있게 이해합시다.파일에 문제를 추가한 다음 워크플로우를 설정하여 이러한 문제를 자동으로 검색하고 해결합니다.

성분


A. PEP-8 코드 라이브러리 위반


자동화 코드 심사에 앞서 몇 가지 코드를 작성해서 심사를 진행합시다.다음은 주어진 숫자의 소수를 열거한 예시 프로그램이다.이것은 당신의 시각을 해칠 수 있다. 이것은 좋은 일이다. 왜냐하면 이것은 당신의 코드 후각이 일하고 있다는 것을 의미하기 때문이다.
# list_primes.py
def is_prime (number): for i in range(2, number): if number%i==0: return False return True def list_primes(upper): for number in range(2, upper): if is_prime(number): print(F"{number} is prime") list_primes(10)
이 각본에는 문제가 많다.오해하지 마세요. 이것은 효과가 있지만 좋지 않아요.
  • 함수 괄호 앞에 남은 공백
  • - 공간 감소
  • 운영자 주변 공간 없음
  • 싱글 라인 서라운드 기능
  • f문자열 의
  • 대문자 F

    B. 블랙코드 포맷 프로그램


    Black은 유행하는 파이톤 코드 포맷 프로그램이다.Python 스타일에 어긋나는 모든 파일을 자동으로 다시 포맷할 수 있습니다.가장 좋은 것은 자기 의견을 고집하기 때문에 너무 많은 설정을 할 수 없기 때문에 자동화에 적합하다는 것이다.
    따라서 Black을 설치하는 동시에 제가 개인적으로 좋아하는 도구인 Pipenv을 사용하여 일류의 의존 관계 관리를 구축하도록 하겠습니다.다음 명령을 실행하면 Repo의 루트 디렉터리에 두 개의 파일 PipfilePipfile.lock을 만들고 Black을 dev 의존 항목으로 설치합니다.
    $ pipenv install --pre --dev black
    
    매개 변수 없이 Black을 실행하면 repo의 모든 파일을 포맷합니다.파일을 다시 포맷하는 것 외에, 그것은 그다지 위험하지 않은 두 가지 패턴이 있다.--check: 이 모드에서 Black은 코드 스타일 충돌이 있는지만 검사합니다.위반이 없으면 0, 위반이 있으면 0이 아닌 0으로 반환됩니다.
    $ pipenv run black --check list_primes.py
    would reformat /Users/dhruvkb/Documents/scratch/automata/list_primes.py
    Oh no! 💥 💔 💥
    1 file would be reformatted.
    
    --diff: 이 모드에서 검은색은 실제 변경이 아니라 변경될 것을 보여 줍니다.이 모드는 실제로 변경하기 전에 변경 사항을 검사하는 데 매우 유용합니다.
    $ pipenv run black --diff list_primes.py
    -------- list_primes.py 2020-02-02 00:00:00.000000 +0000
    +++ list_primes.py  2020-02-02 00:00:00.000000 +0000
    @@ -1,17 +1,19 @@
     # list_primes.py
    -def is_prime (number):
    +def is_prime(number):
    - for i in range(2, number):
    + for i in range(2, number):
    - if number%i==0:
    + if number % i == 0:
    - return True
    + return True
    
    - return False
    + return False
    +
     def list_primes(upper): for number in (2, 10): if is_prime(number):
    - print(F"{number} is prime")
    + print(f"{number} is prime")
    +
    
     list_primes(15)
    

    요리책


    코드 평가는 두 부분으로 나눌 수 있다. 하나는 전체적인 문제를 해결하는 재미있는 부분이고, 다른 하나는 비관용 코드 부분과 코드 스타일이 충돌하는 일반적인 부분을 식별하는 것이다.코드 심사 중의 무미건조한 부분을 자동으로 완성합시다.

    1. Git 연결 설정


    우리는 방금 검은색이 얼마나 신기한지 보았다.만약 Black이 코드를 제출할 때마다 자동으로 실행된다면, 그것은 매우 좋지 않습니까?이것은 가능합니다. Git 갈고리를 사용하세요.Git 갈고리는 일부 Git 명령을 실행할 때 코드 라이브러리에서 실행되는 프로그램입니다.'pre-commit'갈고리는 제출을 만들기 전에lint 검사를 하고 제출이 실패할 때 제출을 방지하기를 원하기 때문에 우리에게 특히 관심이 있습니다.
    Autohooks은 파이톤 패키지로 파이톤을 통해 이 연결을 관리하는 데 사용됩니다.Black과 같은 도구와 통합할 수 있는 플러그인 시스템이 있습니다.Autohook 및 Black 통합 플러그인을 설치합니다.
    $ pipenv install --dev autohooks autohooks-plugin-black
    
    재구매 협의의 루트 디렉터리에 다음과 같은 내용을 포함하는 pyproject.toml 파일을 만듭니다.
    [tool.autohooks]
    mode = "pipenv"
    pre-commit = ["autohooks.plugins.black"]
    
    [tool.autohooks.plugins.black]
    arguments = ["--check"]
    
    연결 고리를 활성화하고 검사 기능을 실행해서 모든 것이 정상인지 확인합니다.
    $ pipenv run autohooks activate
    ✓ autohooks pre-commit hook installed at /Users/hal/Documents/scratch/.git/hooks/pre-commit using pipenv mode.
    
    $ pipenv run autohooks check
    ✓ autohooks pre-commit hook is active.
    ✓ autohooks pre-commit hook is up-to-date.
    ℹ Using autohooks mode "pipenv".
    ✓ Plugin "autohooks.plugins.black" active and loadable.
    
    git commit - 잘못된 소스 코드를 작성했는지 확인하십시오.하, 알았어!다음은 일의 발전이다.
  • 은 사전 제출 연결을 시작합니다.
  • 은 Autohooks의 최고급 hooks를 호출합니다.
  • 그리고
  • Autohooks는 --check 매개변수를 사용하여 Black을 수행합니다.
  • 1710은 0이 아닌 코드를 되돌려줍니다. 1710은 0이 아닌 코드를 되돌려주기 때문입니다.
  • Git는 커밋 작업을 중지합니다.
  • $ git add . && git commit -m "Add the source code to VCS"
    ℹ autohooks => pre-commit
    ℹ Running autohooks.plugins.black
    would reformat /Users/dhruvkb/Documents/scratch/automata/list_primes.py
    Oh no! 💥 💔 💥
    1 file would be reformatted.
    ×
    
    💡 전문 알림: 당신은 --no-verifygit commit 로고를 사용하여 갈고리를 돌아갈 수 있습니다.이렇게 하는 것은 건의하지 않지만, 우리는 경찰이 아니기 때문에 네가 하고 싶은 대로 해라.
    💡 Professional Advisories: --check 매개 변수를 삭제한 후 제출할 때마다 Black에서 파일의 서식을 다시 지정할 수 있습니다.

    2. GitHub 작업을 사용한 Lint 검사


    Git 갈고리의 주요 단점은 그것이 현지의 것이다.여러 공헌자가 있는 프로젝트에서 갈고리를 활성화하는 것을 잊어버리거나 갈고리를 돌려보려고 시도할 수도 있다.이런 상황에서 해결 방안은 원격 환매 자체에서lint 검사를 실행하는 것이다.GitHub Actions는 lint을 실행하기 위해 매우 일반적인 해결 방안을 제공합니다.
    재구매 협의의 lint.yml 디렉터리에 파일 .github/workflows을 만듭니다.
    # .github/workflows/lint.yml
    name: Lint
    
    on: [push, pull_request]
    
    jobs:
     lint:
     runs-on: ubuntu-latest
     steps:
     - uses: actions/checkout@v2
     - uses: actions/setup-python@v2
     - uses: psf/black@stable
    
    이 작업 흐름은 저장소를 검사하고, 파이톤을 설정하고, Black을 설치한 다음, 파일을 정리합니다.기본적으로 이 작업은 --check--diff 매개 변수를 사용하여 검은색으로 실행됩니다.linting이 설정되면 모든 향후 제출 및 PRs가 Black을 통과합니다.

    우리의 list_primes.py 파일은 테스트를 통과할 수 없습니다.로그는 실패한 파일과 이 파일들의 차이를 표시합니다. (-diff 매개 변수 때문)네가 규정을 어겼을 때, 이것은 매우 유용할 것이다.

    3. GitHub 워크플로우를 사용하여 Lint 수정


    이것은 우리가 아직 해결하지 못한 한 방면을 이끌어 냈다.Black은 파일을 다시 포맷할 수 있지만, 지금까지는 문제를 감지하고 차이를 보이기 위해서만 사용되었다.우리는 아직 브레이크의 잠재력을 충분히 발굴하지 못했다.
    우리는 자동화 기능을 11로 향상시키고 GitHub 작업 흐름을 업데이트하여 코드 양식의 충돌을 자동으로 복구하는 것이 어떻습니까?
    # .github/workflows/lint.yml
    name: Lint
    
    on: - push
    - workflow_dispatch
    
    jobs:
     lint:
     runs-on: ubuntu-latest
     steps:
     - uses: actions/checkout@v2
     - uses: actions/setup-python@v2
     - name: Install Python dependencies
     run: |
     pip install pipenv
     pipenv install --deploy --dev --system
     - uses: wearerequired/lint-action@v1
     with:
     github_token: ${{ secrets.GITHUB_TOKEN }}
     black: true
     auto_fix: true
    
    이 작업 흐름은 이전과 같은 두 가지 절차를 사용합니다. 즉, 환매 협의를 서명하고 Python을 설정하는 것입니다.그런 다음 Pipenv를 설치하고 이를 사용하여 시스템에 Black을 설치합니다.lint-action action은 검은색으로 실행된 다음 변경된 파일을 제출합니다.이것은 Black이 diff에 표시된 것과 같은 변경 사항을 만드는 새로운 제출을 만들 것입니다!
    💡 전문 알림: 작성자의 이름, 이메일, 제출한 메시지를 사용자 정의할 수 있습니다.다음 내용을 조작의 with키에 추가하면 됩니다.창의력을 발휘할 수 있는 기회야!
    commit_message: 'Opening the pod-bay doors'
    git_name: 'HAL-9000'
    git_email: '[email protected]'
    

    이제 재구매 프로토콜로 전송된 코드에 스타일 가이드 편차가 없다는 것을 확신할 수 있습니다. 이로써 코드 검토자는 코드를 더욱 전면적으로 볼 수 있고 세부 사항을 HAL에 남길 수 있습니다.

    DeepSource를 사용한 완벽한 자동화


    !이것은 매우 큰 일이지, 그렇지 않니?그런데 어떻게 된 일인지 알아맞혀 봐. 우리는 지금 양식 지침을 위반한 상황만 봤어.안전한 구멍을 찾거나 가능한 구멍을 발견하거나 복잡한 재구성을 하는 등 더 많은 기능을 추가하는 것은 매우 긴 연습이 될 것이다.꼭 그렇지만은 않아요.
    또한 DeepSource을 사용하여 전체 감사, 심사, 재구성 과정을 자동화하는 것도 고려할 수 있습니다. 이것은 몇 가지 도구 (linter와 보안 분석기 포함) 를 통해 요청을 제출할 때마다 코드를 스캔하고 많은 문제를 자동으로 복구할 수 있습니다.DeepSource는 또한 대부분의 언어에 대한 분석기를 맞춤형으로 제작했는데, 이러한 분석기는 끊임없이 개선되고 최신식을 유지한다.
    incredibly easy to set up입니다!저장소 루트 디렉토리에 .deepsource.toml 파일을 추가하면 DeepSource에서 가져옵니다.우리가 방금 겪은 것보다 훨씬 적다.
    version = 1
    
    [[analyzers]]
    name = "python"
    enabled = true
    
      [analyzers.meta]
      runtime_version = "3.x.x"
      max_line_length = 80
    
    [[transformers]]
    name = "black"
    enabled = true
    

    관상대전


    코드 평가는 신입 개발자에게 매우 중요한 학습 도구이다.지식, 경험, 관례를 고급 개발자에서 초보 개발자로 옮기는 방법이자 최종 버전으로 간주되는 코드가 어떻게 더 좋고 깨끗하며 효율적으로 변하는지 이해하는 방법이다.
    나는 외람되게도 코드 평가는 개발자의 가장 좋은 학습 도구 중 하나로 코드 스타일과 같은 자질구레한 일에 낭비된다.약간의 자동화를 도입하여 매번 코드 심사에 의의가 있게 하다.

    They know enough who know how to learn.


    잘하면 코드 심사가 진정한 교육 경험이 될 수 있다.자동화는 이 점을 대체할 수 없다.자동화가 할 수 있는 일은 일상적인 사무를 절차에서 제거하는 것이다.
    Here’s to better code reviews!

    좋은 웹페이지 즐겨찾기