VS Code/Codium : Python Formatter Autopep8/Black 사용.

흠.. 삽질은 역시나 힘들다.

삽질기

VS Code/Codium 에서 코드를 작성한 뒤, 해당 언어에 맞게끔 코드 형식을 정정해주려면 Format 명령(Format Document)을 내리면 된다. 이건 Ctrl + Shift + I 를 누르면 된다. (macOS : ⇧⌥F 인데, 이건 Dvorak-Qwerty 자판이 듣지 않는다. 아마도 Opt 키는 안되는 모양이다.)

지금 찾아보니, macOS 키보드 명칭이 “Dvorak–QWERTY ⌘” 였다. 즉, Command 키에만 해당이 되는 거였네.

** 이 작업을 하면, 이런 식으로 코드가 정리된다.

# 입력
import sys,os

# Ctrl + Shift + I 후
import sys
import os

Python 에선, 이를 위해서 먼저 MS Python Extension 이 설치되어 있어야 한다. 그리고 나서 Ctrl + Shift + I 를 누르면 될 듯 하지만..?

역시나 오류가 발생한다. MS Python Extension 은 Format 의 기준으로 autopep8 꾸러미를 사용하는데, 이게 설치되어 있지 않아서 그렇다. 친절하게도 설치할지를 물어보니 그냥 진행하면 된다. (그러면 pip 을 사용하여 사용자 디렉토리에 autopep8 이 설치된다.)
혹은, pip 을 이용해서 따로 설치해줘도 된다.

python3 -m pip install --user autopep8
python3 -m pip install --user black

Autopep8 이든, Black 이든 원하는대로 골라잡을 수도 있다. 이를 위해선 VS Code 설정에서 Python formatting Provider 로 이동한 뒤 무엇을 사용할지 골라주면 된다. 여기선 Black 으로 가기로 한다.

Black 설치/설정

설치는 위에 있는 pip 명령으로 할 수 있다.
설치 후, 몇가지 설정을 해줘야 하는데.. 이게 OS 에 따라, 또 실행경로 설정에 따라 조금씩 다르다.

VS Code 에서 설정을 직접 열든, 아니면 ~/.config/code/User/settings.json 파일을 직접 편집하든, 원하는 방법으로 다음 내용을 추가한다. (그런데, 이게 좀 애매하긴 하다.)

만약 black 이 실행경로에 포함돼 있다면, 즉, 그냥 black 이라고 입력했을 때 실행이 된다면, settings.json 에는 이렇게만 넣어주면 된다.

"python.formatting.provider": "black",
"python.formatting.blackArgs": [
        "-S",
        "-l 100"
    ],
....

그런데, 이게 또 묘한게..
VS Code 설정에서 입력할 땐 조금 또 다르게 해줘야 한다.

  • Python > Formatting: Provider ➙ black
  • Python > Formatting: Black Path ➙ black (또는 전체 실행 경로 입력)
  • Python > Formatting: Black Args (다음 내용을 한줄에 하나씩 넣는다.)
    -S
    -l 100

-S 를 사용하여 홑따옴표/겹따옴표를 사용자가 쓴 그대로 저장하게끔 해놨고(이게 없으면 따옴표는 무조건 겹따옴표로 바뀐다.), 열은 100(-l 100)으로 설정해놨다.

Black Path 에 아무 내용도 넣지 않으면, black 이 실행되지 않는다. 이게 좀 이상한게, VS Code 설정에서 이 항목에 ‘black’ 이라 입력해도, settings.json 에는 아무 내용이 들어가지 않는다. 경로까지 넣어줘야만 항목이 생긴다.
또 그렇다고 VS Code 설정에서 이 항목을 비워놓으면, black 이 작동하지 않는다. (settings.json 엔 다음과 같이 기록된다.)

    "python.formatting.provider": "black",
    "python.formatting.blackPath": ""

아마도, python.formatting.blackPath 항목이 비어있으면 python.formatting.provider 값을 따르라고 돼 있는 모양이다.

아무튼, 뭐 얘기가 복잡해졌으나, 이렇게 설정하면 Black 실행엔 아무 문제가 없다.

Format on Save 설정

설정에서 ‘Format on Save’ 를 찾고, 선택해준다. 이러면 파일을 저장할 때 black 이 자동으로 실행된다.
세부 사항으로, 파일 전체에 Format 을 적용할지, 아니면 수정한 부분에만 적용할지를 고를 수 있다. 기본값은 ‘modifications If Available’ 이다.

settings.json 엔 이렇게.

    "editor.formatOnSave": true,
    "editor.formatOnSaveMode": "modificationsIfAvailable",

이 단락에 있는 내용들은 Marco Belo 님의 도움을 얻어 알게됐네~!

Black 사용 시엔 Syntax Error 조심!

만약, 코드에 문법오류가 있을 경우엔 Black 이 실행되지 않는다. 실행 오류가 아님에 주의!
예를 들어, python3 에 다음과 같은 행이 들어있다고 한다면, 블랙은 작동되지 않고, 침묵을 지킨다.

print "hello"+"world"

또는, 이런 실수. “grape” 뒤에 콜론이 와야 하는데, 세미콜론을 넣어버렸다.

dict = {    "apple": "red",
    "grape"; "purple",
    "orange": "orange",
    "pear": "brown",
}

VS Code 에 이 오류가 표시되긴 하지만, 그로 인해 Black 이 안된다는 알림은 없다.

반면, 실행 오류와는 상관이 없다.

primt ("hello")

print 를 primt 로 잘못 쳤지만, 이건 실행 시 오류이지, Syntax Error 는 아니기에, Black 은 정상 작동한다.

autopep8 과 Black 은 어떻게 다를까?

autopep8 과 black 의 차이는 많겠지만, 지금까지 발견한 점 하나가 있다.

  • import sys, os : Autopep8 은 한 줄에 하나씩 쓰기를 권장하지만, black 은 허용한다.

이 정도로 마무리.

Author: 아무도안

안녕하세요. 글 남겨주셔서 고맙습니다.