psene를 사용하여 psyhon의 lint 환경을 정리합니다

이른바 pseen


https://github.com/pfnet/pysen
이 도구는 주로 파이톤을 대상으로 하는 linter/formatter를 일원적으로 관리하는 설정으로 누구나 Preferred Networks 회사에서 자주 사용하는 도구 환경을 간단하게 설정할 수 있도록 지원하는 도구입니다.각 팀에 분산할 수 있는 도구와 관련된 경험 기술을 코드로 종합하여 PFN사 내부의 공유를 촉진하는 목적으로 개발한다.psene은 실제로 PFN 사내에서 사용됐으며 2020년 4월 개발이 시작된 이후 2021년 3월까지 100개가 넘는 사내 창고를 도입했다.
인용자 Python의 linter/formatter를 위해 누구나 PFN 회사 내부 도구'pseen'의 소개를 쉽게 설정할 수 있습니다

할 수 있는 일

  • 블랙, mypy,flake8,isort를 동시에 실행하는lint
  • 블랙, isort를 사용하여format
  • 실행
    pseen을 사용합니다. 위에서 말한 바와 같이 여러 도구의 lint,format을 사용하면 psen의 제어 아래 간단하게 진행할 수 있습니다.

    손이 간지러운 데 닿을 수 있는 포인트.


    각pysen에 설치된 구성 요소도psene를 거치지 않고 직접 실행할 수 있으며 단숨에psene로 갈아타는 것은 무섭지만 쉽게 가져올 수 있습니다.

    여기서 하는 일


    pseen에 대한 간단한 사용법과 vscode의 합작법은 자신이 일할 때 약간 촘촘한 요점을 함께 순서대로 쓴다.

    컨디션

  • OS
  • Ubuntu
  • Docker
  • python:3.9-slim
  • 패키지 관리 도구
  • poetry
  • 프레임
  • django
  • 시용하다


    설치하다.


    poetry add -D pysen -E lint
    
    psene용 의존 관계를 이렇게 설치했다.
    주의poetry add -D pysen일 경우 초기 상태에서 의존성이 부족하다.

    git 설치


    명령을 실행할 때git를 사용하기 때문에 docker를 사용하거나 환경이 좋지 않은 경우 미리 설치하고 호출합니다.

    설정

    pyproject.toml에 pson용 설정을 추가합니다.
    pyproject.toml
    [tool.pysen]
    version = "0.9"
    
    [tool.pysen.lint]
    enable_black = true
    enable_flake8 = true
    enable_isort = true
    enable_mypy = true
    mypy_preset = "strict"
    line_length = 88
    py_version = "py37"
    [[tool.pysen.lint.mypy_targets]]
      paths = ["."]
    

    세부적인 설정


    실행
    pysen generate .
    
    을 통해 상세한 설정용 파일을 생성하기 때문에 이 파일을 통해 진행됩니다.(확인 불가)
    다시 확인하면 export 설정일 뿐 여기에 적힌 설정이 적용되지 않았다고 생각합니다.builder에도 상세하게 설정된 내용이 적혀 있어 상세한 조정은 그곳에서 진행될 수 있다.확인 후 업데이트합니다.
    ref: https://github.com/pfnet/pysen#how-it-works-settings-file-directory

    실행


    lint

  • black
  • flake8
  • isort
  • mypy
  • 상기 도구를 조합해서 실행할 수 있으며, 항목별로 lint의 실행 결과를 볼 수 있습니다.
    pysen run lint
    
    # 例
    Running commands concurrently...
    ... concurrent execution done
    Running: black
    Checking 6 files
    error: cannot format /workspace/django_pysen/settings.py: Cannot parse: 16:8: BASE_DIR   = Path(__file__).resolve().parent.parent
    Oh no! 💥 💔 💥
    5 files would be left unchanged, 1 file would fail to reformat.
    Running: flake8
    Checking 6 files
    /workspace/django_pysen/settings.py:16:9: E221 multiple spaces before operator
    /workspace/django_pysen/settings.py:16:10: E999 SyntaxError: invalid non-printable character U+3000
    Running: isort
    Checking 6 files
    Running: mypy
    [1/1] Checking 1 entries
    /workspace/django_pysen/settings.py:16: error: invalid non-printable character
    U+3000  [syntax]
        BASE_DIR   = Path(__file__).resolve().parent.parent
                  ^
    Found 1 error in 1 file (checked 6 source files)
    
     ** execution summary **
    isort .......... OK (0.48 sec)
    black .......... Failed (0.41 sec)
    flake8 .......... Failed (0.46 sec)
    mypy .......... Failed (0.31 sec)
    
    lint finished with error(s)
    Errored:
     - black
     - flake8
     - mypy
    

    format


    lint 검사 항목 중 자동으로 수정할 수 있는 항목은 변경이 필요합니다.
    pysen run format
    
    # 例
    Running commands
    Running: isort
    Checking 6 files
    Running: black
    Checking 6 files
    reformatted /workspace/django_pysen/wsgi.py
    reformatted /workspace/django_pysen/settings.py
    All done! ✨ 🍰 ✨
    2 files reformatted, 4 files left unchanged.
    
     ** execution summary **
    isort .......... OK (0.40 sec)
    black .......... OK (0.35 sec)
    

    파일, 디렉토리별로 실행

    run_files를 사용하여 path 지정을 통해 다음 lint or format 명령을 실행할 수 있습니다.
    pysen run_files lint {path}
    

    VScode로 해볼게요.


    확장 제거


    ms-python.python가 설치되어 있으면 이후에 들어온pseen 측의 확장 기능과 충돌이 발생하여 먼저 철거합니다.

    pysen-ls


    VScode와 합작하기 위해 psene에 대응하는language 서버에 가입했습니다.
    (pyproject에psen-Ls의 기술이 들어가기 때문에poetry로 가입하지 않는 게 좋아요?)
    poetry add -D pysen-ls
    

    설치 확장



    설치bonprosoft.pysen-vscode.

    동작 확인


    formatOnSave로 지정하거나 Format Current Document에서 수행할 수 있습니다.

    또한 PROPBLEMS 레이블에서 확인할 수 있습니다.

    참고 자료

  • https://github.com/pfnet/pysen
  • https://tech.preferred.jp/ja/blog/pysen-is-the-new-sempai/

  • 작업 일지

  • https://zenn.dev/tktcorporation/scraps/d683ce5123883b
  • 동작 확인용 Repository

  • https://github.com/tktcorporation/django-poetry-pysen-sample
  • 좋은 웹페이지 즐겨찾기