Skip to content

VSCode에서 python 코드를 자동으로 이쁘게 정리해보자 - lint와 formatter

🧹 코드를 자동으로 정리하고 싶다.

코드가 길어지고, 파일이 많을 수록 수동으로 코드 스타일을 만족하여 짠다는게 쉽지가 않다. 물론, 기본적으로 습관화하여 코드를 짜도록 노력해야 하지만 사람이 어떻게 하루종일 코드의 스타일을 준수하면서 짤 수 있을까? 코드의 맞춤법이 어긋날수록 가독성이 떨어지고, 정리가 되어 있지 않은 느낌을 받아 분석하기가 어려워지게 된다. 하지만, 워드나 한글처럼 맞춤법을 자동으로 체크해주고, 틀린 맞춤법을 수정 할 수 있게 설정할 수 있다면? 코드의 구현에 좀 더 에너지를 쓸 수 있을 것이다.

📐 PEP8 이란?

여러명이 하나의 프로젝트를 작업하게 되면, 늬앙스나 코드를 짜는 스타일이 각각 달라, 코드의 분석을 어렵게 만들고 유지보수가 어려워진다. 이를 해결하기 위해 일관된 맞춤법 가이드를 code convention 또는 code style guide라 부르며, pep8은 python의 code convention 또는 style guide라고 생각하면 된다.

이러한 code convention 및 code style을 준수하며 짜는지 확인할 수 있는 tool 들이 있는데, 이것들이 바로 linterformatter라고 한다.

👀 linter와 formatter의 차이

우선 linter는 맞춤법 검사기 formatter는 교정기의 차이이다. linter는 맞춤법만 지적하며 자동으로 수정하지 않는다.

파이썬에서 대표적으로 사용하는 linterflake8을 사용한다.

자동으로 수정하기 위해선 formatter라는 것을 설치해야 하며 파이썬에선 대표적으로 autopep8black이 있다.

blackautopep8과 비교했을 때, 상대적으로 코드 수정 개입에 적극적이므로, 필자의 글에서는 black을 설치하고 설정하는 법을 소개하려고 한다.

formater만 사용해도 되지 않을까?

자동으로 교정할거면 formatter만 사용하면 되지 않을까? 라고 생각될 수도 있다. 하지만, formatter는 기본적으로(적어도 VSCode)에서는 어디가 맞춤법이 틀렸는지 알려주지 않으며1, 자동으로 수정해버린다. 따라서 보통 필자는 linterformatter를 같이 사용한다.


⚙️ VSCode linter formatter 설정

1️⃣ black 및 flake8을 requirements 추가

우선 파이썬 프로젝트를 하고자 할 때, 의존하고 있는 모듈을 관리하기 위해서 프로젝트 디렉토리 제일 상단에 requirements 디렉토리를 생성하고, requirements 안에 dev.txt, prod.txt, test.txt 파일을 생성하자.

생성하고 나서는 아래와 같이 파일 및 디렉토리 구조가 될 것이다.

project 디렉토리 구조
[Project Directory]
├── requirements
│   ├── dev.txt
│   ├── prod.txt
│   └── test.txt
...
만약 예시가 어렵다면 필자의 프로젝트인 backtest를 참고 할 수 있다.

formatterblacklinterflake8을 설치하기 위해 dev.txt 파일에 아래의 하이라이트 된 내용을 추가한다.

dev.txt
-r prod.txt
black
flake8
...

마지막으로, pip install -r requirements/dev.txt 명령어를 실행하여 패키지를 설치해보자.

dev.txt 안에 -r prod.txt 는 무엇인가요?

사실 프로젝트를 구동시키기 위해서 모듈 전체가 필요한 건 아니다. 불필요한 모듈들을 관리하기 위해 test dev prod로 나뉘었고, 위의 옵션처럼 -r prod.txt를 사용한다면, pip install -r requirements/dev.txt 명령어로 패키치 설치 시 prod.txt 파일에 있는 모듈들도 참조하게 된다.

해당 프로젝트는 test.txtdev.txtdev.txtprod.txt를 참조하므로 test.txt로 설치한다면, 프로젝트를 테스트하기 위한 모든 패키지가 설치되도록 구성할 수 있다.

2️⃣ VSCode extention 추가

VSCode에서 blackflake8을 사용하기 위해 extension을 설치해보자. 우선 python extension을 설치한 뒤, black을 사용하기 위해 black-formatter를 검색한 후 설치하고, flake8을 사용하기 위해 flake8을 설치한다.

Image title

그림 1 - extension 설치 과정

3️⃣ VSCode 환경 설정하기

User, Remote, Workspace

VSCode의 재미있는 기능 중 하나는 User, Remote, Workspace별로 설정을 분리하여 사용할 수 있다. 프로젝트별로 환경을 다르게 설정하려면 Workspace에서 환경설정을 변경하면 된다.

VSCode를 실행한 후 프로젝트를 불러온 후 Ctrl + Shift + P를 누르면 아래의 그림과 같이 명령창이 나타나게 되는데, Preferences: Open Workspace Settings라고 입력하게 되면, 설정화면이 나타나게 된다.

설정화면이 나온 후, formatter를 입력하면, Editor: Default Formatter 온셥이 나오게 되는데, 이 때 Black Formatter를 선택해주면 된다.

또한, 자동으로 코드가 수정되기 위해서 Editor: Format on Save 기능을 체크해 놓자.

Image title

그림 2 - VSCode 설정 화면

.vscode 디렉토리

설정을 하고나면 프로젝트 디렉토리에 .vscode디렉토리에 settings.json 파일이 생성이 될 것이다. 해당 파일을 확인하면, 방금 전 설정했던 내용들이 그대로 적용되는 것을 확인할 수 있다.

만약 다른 사용자가 VSCode를 이용하여 프로젝트를 열게 된다면, .vscode 디렉토리안의 settings.json에 따라 저절로 설정이 될 것을 기대할 수 있다.

.vscode/settings.json
{
    "editor.defaultFormatter": "ms-python.black-formatter",
    "editor.formatOnSave": true
}

🆙 [응용] 언어 별로 formatter를 적용해보기

만일, python 파일 이외에 markdown이나, 다른 프로그래밍 언어의 formatter를 동시에 적용하고 싶다면 settings.json파일을 아래와 같이 수정하면 된다.

.vscode/settings.json
{
    "[python]": {
        "editor.defaultFormatter": "ms-python.black-formatter",
        "editor.formatOnSave": true
    },
    "[markdown]": {
        "editor.defaultFormatter": "formatter1",
        "editor.formatOnSave": true
    },
    "[지원하는 Program Language]":{
        "editor.defaultFormatter": "formatter2",
        "editor.formatOnSave": true
    }
    ...
}

✅ 적용 전 > 적용 후

위와 같이 적용한다면, .py파일을 저장할 때, 아래의 그림처럼 자동으로 formatting되어 저장된다.

Image title

그림 3 - formatting 적용 후

🆙 [응용] 예외 조건 추가하는 방법

만일, PEP8 중에서 아래의 그림과 같이 글자 길이의 차이로 인해 코드의 가독성이 나빠질 수 있다. formatter로 맞춤법은 다 자동으로 수정하지만, 단점으로는 그대로 두는 것이 훨씬 더 가독성 있을 수 있으므로 예외 조건을 추가해보자.

Image title

그림 4 - 글자길이가 너무 김

pyproject.toml 파일과, .flake8 파일에 예외 조건 추가하기

프로젝트 제일 상단 디렉토리에 pyproject.toml.flake8파일을 생성해준다.

pyproject.toml파일에 black formatter를 위한 예외처리 옵션을 하나 추가한다.

아래의 line-length옵션은 글자 길이를 120자까지 늘리는 옵션이다.

pyproject.toml
[tool.black]
line-length = 120

.flake8파일에 예외 처리 옵션을 주어, pep8 오류가 나지 않도록 수정한다. 예외처리를 원하는 정책은 extend-ignore 항목에 그림 4와 같이 정책 번호를 ,를 이용하여 추가해주면 된다.

아래의 예제에선 글자제한(E501)을 예외로 두고, : 뒤에 공백이 있으면 안되는 정책(E203)을 예외로 추가해주었다.

.flake8
[flake8]
max-line-length = 120
extend-ignore = E203,E501

마무리

이로써 VSCode를 이용하여 코드를 작성 시 자동으로 코드 스타일에 맞게 저장하도록 설정하는 법을 정리해 보았다. 코드를 가독성 있게 formatting 하는 것도 중요하지만, 논리 또한, 가독성 있게 짜는 것이 더 중요하다고 생각한다.



  1. 다른 설정방법을 알고 있다면, 댓글로 알려주시면 감사하겠습니다 🙏 

Comments