IT/기초 지식

flake8과 Black을 도입해 깔끔하고 정형화된 python 코드 쓰기

개발자 두더지 2022. 4. 14. 16:48
728x90

flake8과 Black이란?


flake8

 flake8이란 "pep8의 체크, pyflakes의 체크 및 순환 복잡도를 체크할 수 있는 Wrapper"이다. 즉, 폭 넓게 커버해주는 Python의 코드 체크 툴이다. flake8은 아래의 항목을 체크해준다.

  • PyFlakes (pyflakes : 코드의 에러 체크)
  • pycodestyle (pycodestyle : PEP8에 준거하고 있는지를 체크)
  • Ned Batchelder's McCabe script (mccabe : 순환 복잡도를 체크)

Black

다만, flake8은 코드의 체크를 해주긴 하지만 에러의 수정까지는 불가능하다. 여기서 에러를 자동으로 수정해주는 것이 Black이다.  

 

 

flake8의 도입 및 실행


 이제 flake8을 사용해보자 ! 그전에 먼저 flake8를 설치할 필요가 있다. 아래의 pip 커맨드로 설치할 수 있다.

$ pip install flake8

 실제로 사용할 때는 아래의 커맨드를 사용한다.

$ flake8 파일명

 또한, 파일명뿐만 아니라 디렉토리명을 적어도 실행할 수 있다. 여기서는 django의 blogs이라는 어플리케이션을 시험삼아 실행시켜 본 결과 다음과 같은 결과가 출력됐다.

$ flake8 blogs
blogs/views.py:3:1: E302 expected 2 blank lines, found 1
blogs/views.py:4:47: W292 no newline at end of file
blogs/urls.py:7:2: W292 no newline at end of file
blogs/admin.py:5:1: W391 blank line at end of file
blogs/models.py:4:1: E302 expected 2 blank lines, found 1
blogs/models.py:11:26: W292 no newline at end of file
blogs/tests.py:1:1: F401 'django.test.TestCase' imported but unused
blogs/migrations/0001_initial.py:17:80: E501 line too long (114 > 79 characters)

 또한, --show-source 옵션을 붙이면 수정 사항을 알기 쉽게 출력해준다.

$ flake8 --show-source blogs
blogs/views.py:3:1: E302 expected 2 blank lines, found 1
def index(request):
^
blogs/views.py:4:47: W292 no newline at end of file
    return render(request, 'blogs/index.html')                                              ^
blogs/urls.py:7:2: W292 no newline at end of file
] ^
blogs/admin.py:5:1: W391 blank line at end of file

^
blogs/models.py:4:1: E302 expected 2 blank lines, found 1
class Blog(models.Model):
^
blogs/models.py:11:26: W292 no newline at end of file
        return self.title                         ^
blogs/tests.py:1:1: F401 'django.test.TestCase' imported but unused
from django.test import TestCase
^
blogs/migrations/0001_initial.py:17:80: E501 line too long (114 > 79 characters)
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),

 

 

Black의 도입 및 실행


 black을 도입하기 위해는 다음의 pip 커맨드로 설치한다.

$ pip install black

 그러나, 다음과 같은 에러가 발생하는 경우가 있을 수 있다.

Cannot pip install black: No matching distribution found for black

 이 에러를 한 번에 해결할 수 있는 방법이 있으므로 간단히 소개하고자 한다. 바로 아래의 커맨드로 설치를 실행하는 것이다. 

python3.6 -m pip install black

 black은 python3.6이후의 버전이 아니면 기능하지 않는듯 하므로,  이 커맨드로도 해결되지 않았다면 python 버전을 확인해보자.

 

VSCode의 설정

 Black의 설치가 끝나면 다음은 VSCode의 설정을 하자. VSCode의 settings의 설정은 아래와 같다.

설정명 기능 설정값
python.linting.enabled Lint 기능을 유효화할 것인가? true
python.linting.pylintEnabled Linter에 pylint를 사용할 것인가? flase
python.linting.flake8Enabled Linter에 flake8을 사용할 것인가? true
python.linting.lintOnSave 파일 저장시에 Lint를 실행할 것인가? true
python.formatting.provider Python 코드의 정형 방식으로 무엇을 사용할 것인가? black
editor.formatOnSave 파일 저장시에 자동 정형을 사용할 것인가? true

 

실제로 사용해보기

아래의 코드를 저장하면,


 def foo():
    print(
                "Hello"
        "World"
        )

실제로는 다음과 같이 저장된다.

def foo():
    print("Hello" "World")

참고자료

https://qiita.com/tsu_0514/items/949827f6a1cfca32dc65

https://qiita.com/84zume/items/ac969931b5f08fef0841

https://qiita.com/tsu_0514/items/2d52c7bf79cd62d4af4a

728x90