Black

Black은 파이썬을 위한 강력하고 엄격한 코드 포매터.
“The Uncompromising Code Formatter"라는 모토를 가지고 있으며, 코드 스타일에 관한 논쟁을 줄이고 개발자들이 더 중요한 작업에 집중할 수 있도록 돕는 것을 목표로 한다.

주요 특징

  1. 일관성: Black은 모든 프로젝트에서 일관된 코드 스타일을 제공한다.
  2. 자동화: 코드를 자동으로 포맷팅하여 개발자의 수동 작업을 줄인다.
  3. PEP 8 호환: Python의 공식 스타일 가이드인 PEP 8을 따르지만, 일부 규칙은 더 엄격하다.
  4. 최소한의 설정: 설정 옵션이 제한적이어서 팀 내 스타일 논쟁을 줄인다.
  5. 빠른 실행: 대규모 코드베이스에서도 빠르게 작동한다.

핵심 원칙

  1. 줄 길이 제한
    • 기본적으로 88자로 제한된다. (이는 PEP 8의 79자보다 더 관대합니다)
    • 긴 줄은 자동으로 여러 줄로 나뉜다.
    • 괄호 안의 요소들은 수직으로 정렬된다.
  2. 일관된 문자열 따옴표 사용
    • 기본적으로 큰따옴표(")를 선호한다.
    • 문자열 내에 따옴표가 있는 경우 자동으로 적절한 따옴표를 선택한다.
  3. 공백과 들여쓰기
    • 항상 4칸 들여쓰기를 사용한다.
    • 연산자 주변에 일관된 공백을 추가한다.
    • 쉼표 뒤에 항상 공백을 추가한다.

설치 및 사용

pip를 통해 쉽게 설치할 수 있다:

1
pip install black

사용 예:

1
black myscript.py

예시

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# 포매팅 전 코드
def complex_function   (  x,y=42,     z: Optional[int]=None   ):
    """이 함수는 의도적으로 나쁜 포매팅을 가진 예시입니다"""
    if x==4: return y
    
    if z is None:z=100    
    
    result=[
        x,y,z,
        x +y,
        x   +z,
        y+z,
        x+y+z
        ]
    
    # 긴 줄의 예시
    really_long_variable_name = "이것은 매우 긴 문자열입니다. Black은 이 줄을 자동으로 여러 줄로 나눌 것입니다." + "추가 문자열입니다."
    
    return     result

# Black 포매팅 후 코드
def complex_function(
    x, y=42, z: Optional[int] = None
):
    """이 함수는 의도적으로 나쁜 포매팅을 가진 예시입니다"""
    if x == 4:
        return y

    if z is None:
        z = 100

    result = [
        x,
        y,
        z,
        x + y,
        x + z,
        y + z,
        x + y + z,
    ]

    # 긴 줄의 예시
    really_long_variable_name = (
        "이것은 매우 긴 문자열입니다. Black은 이 줄을 자동으로 여러 줄로 나눌 것입니다."
        + "추가 문자열입니다."
    )

    return result

통합 개발 환경(IDE)과의 통합

VS Code 통합

VS Code에서는 ‘Black Formatter’ 확장을 설치하고 기본 포매터로 설정할 수 있다.
‘Format on Save’ 옵션을 활성화하면 파일 저장 시 자동으로 Black이 적용된다.

프로젝트 설정

Black의 동작은 pyproject.toml 파일을 통해 구성할 수 있다:

1
2
3
4
5
6
7
8
9
[tool.black]
line-length = 88
target-version = ['py37']
include = '\.pyi?$'
extend-exclude = '''
# 추가로 제외할 파일이나 디렉토리
/dist
/build
'''

장점

  1. 코드 리뷰 효율성 향상: 스타일 문제보다 로직에 집중할 수 있다.
  2. 일관된 코드베이스: 프로젝트 전반에 걸쳐 일관된 스타일을 유지한다.
  3. 시간 절약: 수동 포맷팅 작업이 필요 없어진다.
  4. 가독성 향상: 일관된 스타일로 코드 가독성이 개선된다.

단점

  1. 엄격한 규칙: 일부 개발자들은 Black의 엄격한 규칙을 불편하게 느낄 수 있다.
  2. 기존 코드와의 충돌: 기존 프로젝트에 도입 시 대규모 변경이 필요할 수 있다.

주의사항과 제한사항

Black을 사용할 때 고려해야 할 몇 가지 사항들이 있다:

  1. 강제적인 스타일
    • Black은 매우 엄격하며 대부분의 설정을 사용자가 변경할 수 없다
    • 때로는 원하는 형식과 다르게 포매팅될 수 있다
  2. 첫 실행 시 큰 변화
    • 처음 Black을 적용하면 많은 파일이 변경될 수 있다
    • 점진적인 도입을 고려해야 할 수 있다
  3. Git 히스토리 영향
    • 대규모 포매팅은 Git 히스토리를 복잡하게 만들 수 있다
    • 적절한 시점에 한 번에 포매팅하는 것이 좋다

참고 및 출처