Python:) Black으로 코드 스타일 자동화

짱구석·2021년 3월 7일
1

회사에서 python code formatte로 Black을 사용하고 있어 정리해보려고 합니다

왜 코드 스타일을 자동화 해야할까요?

마치 한사람이 만든 것과 같은 코드

여러사람이 코드를 짜다보면 저마다 자신이 편한 코드 스타일이 있습니다.
어떤사람은 "double quotes" 를 선호하고, 다른 누군가는 'single quote'를 선호할 수 있습니다.

서로 다른 스타일이 적용된 코드를 보면 다른 누군가이 코드를 수정하려고 할 때 혼란이 올 수 있습니다.
'어떤 스타일에 맞춰야되는 거지?'

또한, 가독성 높이기 위해서는 마치 한사람이 만든 것과 같은 코드 가 중요하다고 생각합니다.
설령, 서로 어떤 스타일로 통일 하자고 결정하고 문서를 만들어서 약속을 정하는 방법이 있지만 그것으로는 부족합니다.

문서를 매번 확인 해야하는 것은 번거롭고, 거의 그럴일은 없겠지만 만약 코드 스타일에 수정사항이 있으면 일일히 확인해서 기존의 것을 수정하기도 힘듭니다.

따라서 간단한 명령으로 코드 스타일을 통일시켜주는 방법을 찾아야할 필요가 있습니다.

Black


Black is the uncompromising Python code formatter

Black은 엄격한 파이썬 코드 포맷터 입니다.

Black gives you speed, determinism, and freedom from pycodestyle nagging about formatting. You will save time and mental energy for more important matters.

여러분은 Black을 통해 코드 스타일에 대한 잔소리로부터 자유를 얻을 수 있고, 더 중요한 문제에 시간과 에너지를 쏟을 수 있도록 해줍니다. (의역)

Black makes code review faster by producing the smallest diffs possible

Black

Black Playground에서 설치없이 어떻게 작용하는지 확인 해볼 수 있습니다.

설치

pip install black

사용방법

  • 변경전
from seven_dwwarfs import Grumpy, Happy, Sleepy, Bashful, Sneezy, Dopey, Doc
x = {  'a':37,'b':42,

'c':927}

x = 123456789.123456789E1234567891111111111111

if very_long_variable_name is not None and \
 very_long_variable_name.field > 0 or \
 very_long_variable_name.is_debug:
 z = 'hello '+'world'
else:
 world = 'world'
 a = 'hello {}'.format(world)
 f = rf'hello {world}'
if (this
and that): y = 'hello ''world'#FIXME: https://github.com/python/black/issues/26
class Foo  (     object  ):
  def f    (self   ):
    return       37*-2
  def g(self, x,y=42):
      return y
def f  (   a: List[ int ]) :
  return      37-a[42-u :  y**3]
def very_important_function(template: str,*variables,file: os.PathLike,debug:bool=False,):
    """Applies `variables` to the `template` and writes to `file`."""
    with open(file, "w") as f:
     ...
# fmt: off
custom_formatting = [
    0,  1,  2,
    3,  4,  5,
    6,  7,  8,
]
# fmt: on
regular_formatting = [
    0,  1,  2,
    3,  4,  5,
    6,  7,  8,
]

다음과 같이 보기만해도 불편함으로 가득한 코드가 있습니다.
해당 코드를 작성한뒤 터미널에 다음과 같이 입력해줍니다.

black {파일 또는 폴더 이름}

  • 변경 후
from seven_dwwarfs import Grumpy, Happy, Sleepy, Bashful, Sneezy, Dopey, Doc

x = {"a": 37, "b": 42, "c": 927}

x = 123456789.123456789e1234567891111111111111

if (
    very_long_variable_name is not None
    and very_long_variable_name.field > 0
    or very_long_variable_name.is_debug
):
    z = "hello " + "world"
else:
    world = "world"
    a = "hello {}".format(world)
    f = rf"hello {world}"
if this and that:
    y = "hello " "world"  # FIXME: https://github.com/python/black/issues/26

class Foo(object):
    def f(self):
        return 37 * -2

    def g(self, x, y=42):
        return y

def f(a: List[int]):
    return 37 - a[42 - u : y ** 3]

def very_important_function(
    template: str,
    *variables,
    file: os.PathLike,
    debug: bool = False,
):
    """Applies `variables` to the `template` and writes to `file`."""
    with open(file, "w") as f:
        ...

# fmt: off
custom_formatting = [
    0,  1,  2,
    3,  4,  5,
    6,  7,  8,
]
# fmt: on
regular_formatting = [
    0,
    1,
    2,
    3,
    4,
    5,
    6,
    7,
    8,
]

확실히 이전 보다 깔끔해졌다고 느껴집니다.
이렇게 Black은 내가 어떻게 코드를 작성하든 일관된 스타일로 변경해줍니다.

다음과 같이 fmt: on 통해 원하는 구분에는 포맷팅이 적용되지 않게 할 수 있습니다.

## 해당 구문은 오히려 포맷을 적용하지 않았을 때 가독성이 좋습니다.
# fmt: off
custom_formatting = [
    0,  1,  2,
    3,  4,  5,
    6,  7,  8,
]
# fmt: on
regular_formatting = [
    0,
    1,
    2,
    3,
    4,
    5,
    6,
    7,
    8,
]

옵션

여러 옵션을 통해 팀의 코드 스타일에 맞춰 custom 할 수 있습니다.

-l : 한 라인에 최대 글자 수 (초기값 88)

—diff : 파일을 변경하지 않고 변경되는 부분을 콘솔로 보여준다.

—color : —diff를 사용했을 때 변경점에 색을 입힌다.

black {파일명 또는 폴더명} -l 80 --diff --color

다음과 같이 사용하면 변경사항을 preview 할 수 있습니다.

참고

Black

0개의 댓글