ice rabbit programming

[Python] VS Code에서 Python lint 적용하기 본문

Development/Python

[Python] VS Code에서 Python lint 적용하기

판교토끼 2021. 1. 2. 17:59

python은 스타일 가이드가 꽤 엄격한 편에 속한다. 특히 다른 언어에서는 논쟁거리가 되는 indent(들여쓰기)가 아예 문법으로서 기능하기도 한다. PEP-8이라는 공식 스타일 가이드를 배포하는데, 양이 매우 방대하다.

C#에서 문법 검사 및 오토 포매팅해주는 툴인 Resharper를 사용해보고, 툴의 강력함을 느꼈었는데, VS Code에서는 무료 확장으로 많은 linter를 제공한다. 본인은 많이 쓰는 pylint, pyright, black을 설치하여 사용하고 있다.

(좀 더 자세한 설명을 원한다면 VS Code 공식 문서 혹은 이쪽 글에도 비교 정리가 잘 되어있다.)

이번 포스팅에서는 간략한 개요와, 설치 가이드 위주로 다룰 예정이다.

Code Style Checker

문법 검사를 하고 Warning이나 Error의 노란/빨간 줄을 띄워주는 역할은 Code Style Checker가 수행한다. 대표적인 Code Sylte Checker는 아래와 같다.

  • pylint : VS Code에서 .py 파일을 만들면 확장에서 설치하라고 가장 먼저 나오는 대표적인 linter이다.
  • pycodestyle : PEP-8 가이드를 기반으로 코드를 체크해준다.
  • pyflakes : 파이썬 코드를 검증해주는 툴로, 에러 체킹에 중점을 둔다.
  • flake8 : pycodestyle + pyflakes를 래핑(wrapping)한 형태의 툴이다.
  • pyright : 정적 타입 검사기로, 인터프리터이자 자료형을 명시하지 않는 파이썬의 오류를 미리 검출해준다.

물론 여러 개 조합도 가능하고, 각각에 대해서도 어떻게 할 것인지 설정이 가능하다. multi를 사용한다면 충돌할 경우 수동으로 해결이 필요하다. 본인은 pylint+flake8을 썼다가, 현재는 pylint+pyright 조합을 사용하고 있다.

Auto Formatter

체크를 Code Style Checker가 수행한다면, 그 수정사항의 자동 맞춤은 Auto Formatter가 수행한다. 대표적으로는 아래와 같다.

  • autopep8 : pycodestyle의 결과를 기반으로 수정해준다. pycodestyle과 조합하면 좋다.
  • yapf : 보기 좋은 코드를 지향한다.
  • black : 파이썬의 공식 organization에서 개발한 formatter이다.

필자는 처음부터 black을 채택했고, 만족하면서 사용했기에 현재까지 사용하고 있다.

설치하기

일단은 현재 필자가 사용 중은 pylint + pyright + black을 예로 들어서 쓸 것이다. 다만, 위에서 언급한 툴은 확장으로 VS Code에서 모두 제공하고 있기에 큰 틀에서는 적용법이 같다.

1. .vscode/settings.json을 생성
-> 수동으로 생성하거나, VS Code 좌측 하단의 Python을 눌러 가상 환경 내의 Python.exe를 누르면 자동 생성할 수도 있다.

2. pip로 툴을 설치하거나, VS Code 확장에서 설치
-> 필자는 pip 패키지를 관리해주는 pipenv를 사용하기 때문에 pipenv에 존재하는 툴들은 명시적으로 pipenv install을 사용한다. 기본 pip를 이용한다면 확장에서 설치해도 무방하다.
-> pipenv에 없다면 확장 설치도 문제가 되지는 않는다다. 실제로 pyright는 pipenv에 존재하지 않아 확장 설치를 진행해야 한다.

확장 설치는 VS Code 좌측 메뉴에서 진행하면 되고, pipenv는 아래처럼 명령어를 입력해주면 된다.

pipenv install pylint --dev
pipenv install black --dev --pre

 

--pre는 베타 버전이라는 뜻인데, pipenv에서 black을 베타로 취급하기 때문에 붙여준다.

3. 1에서 생성한 settings.json을 수정

{
    "python.pythonPath": "{가상환경}\python.exe",
    "python.formatting.provider": "black",
    "python.formatting.blackArgs": [
        "--line-length",
        "80"
    ],
    "editor.formatOnSave": true,
    "python.linting.pylintEnabled": true,
    "python.linting.enabled": true,
    "python.linting.lintOnSave": true,
    "python.linting.flake8Enabled": true,
    "python.linting.pylintArgs": [
        "--load-plugins",
        "pylint-flask"
    ],
}

 

여러 설정들은 임의로 추가/삭제해도 무방하다. 단, VS Code에서 select를 통해 lint를 지정할 경우 multi linter 허용이 off되므로, settings.json을 통해서만 설정을 건드려야 한다.

4. root 위치에 pyrightconfig.json 생성

pyright는 특이하게 따로 config를 생성하여 적용받는다. 루트 디렉토리에 pyrightconfig.json을 생성해주자.

{
  "include": [
    "linting할 경로"
  ],
  "exclude": [
    "linting 제외할 경로"
  ],
  "reportTypeshedErrors": true,
  "reportMissingImports": false,
  "pythonVersion": "3.8",
  "pythonPlatform": "Darwin"
}

 

이후에 python 파일을 수정하고 저장하면 auto formatting이 되고, 규칙을 제대로 안지키면 빨간 줄, 노란 줄로 잔소리가 제대로 작동함을 볼 수 있다.