Post

[Python] python fomatter: ruff์™€ black

[Python] python fomatter: ruff์™€ black

๐Ÿ”ต ํŒŒ์ด์ฌ ํฌ๋งทํŒ…

์˜ˆ์ „์— ์กฐ๊ต๋ฅผ ํ• ๋•Œ ์ด ์‚ฌ๋žŒ์ด ์ฝ”๋“œ๋ฅผ ์ข€ ํ•˜๋Š” ์‚ฌ๋žŒ์ธ์ง€ ์•„๋‹Œ์ง€ ์•„๋Š” ๋ฐฉ๋ฒ•์€ ์ฝ”๋“œ์˜ ํฌ๋งท์„ ์ง€ํ‚ค๋Š”์ง€ ๋ณด๋Š” ๊ฒƒ์ด์—ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์š”์ฆ˜์€ ์‹œ๋Œ€๊ฐ€ ์ข‹์•„์ง„ ๊ฒƒ์ธ์ง€ VScode์—๋Š” ํฌ๋งคํ„ฐ๊ฐ€ ์ž๋™์œผ๋กœ ํฌ๋งทํŒ…์„ ํ•ด์ค€๋‹คโ€ฆ ๊ทธ๋™์•ˆ ๋‚˜๋Š” ๋ญ˜ ์œ„ํ•ด์„œ ํฌ๋งทํŒ… ๊ณต๋ถ€ํ•˜๋ฉด์„œ ์ผ์ผ์ด ๊ณ ์น˜๊ณ  ์•‰์•„ ์žˆ์—ˆ๋˜ ๊ฒƒ์ธ๊ฐ€ใ…œ

์•„๋ฌดํŠผ VScode ์‚ฌ์šฉ์ž๊ฐ€ ํŒŒ์ด์ฌ ์ฝ”๋“œ ์Šคํƒ€์ผ์„ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ฝ”๋“œ ํฌ๋งคํ„ฐ(formatter)๋Š” ํ•„์ˆ˜ ์ต์Šคํ…์…˜์ด๋‹ค.

์ตœ๊ทผ์—” ruff๊ฐ€ ์—„์ฒญ๋‚˜๊ฒŒ ํ•ซํ•ด์ง€๋ฉด์„œ, ๊ธฐ์กด์˜ black๊ณผ ๊ฐ™์ด ์“ฐ๋ฉด ๊ฟ€์ด๋ผ๋Š” ์ •๋ณด๋ฅผ ์–ป์–ด์„œ
์ด๋ฒˆ ๊ธ€์—์„  VSCode ๊ธฐ์ค€์œผ๋กœ ์ถ”์ฒœํ•˜๋Š” ํฌ๋งคํ„ฐ ์กฐํ•ฉ๊ณผ ์„ค์ •๋ฒ•์„ ๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•ด๋ณด์•˜๋‹ค.


โšช ์ฃผ์š” ํŒŒ์ด์ฌ ํฌ๋งคํ„ฐ ๋น„๊ต

Formatter์ฃผ์š” ํŠน์ง•์žฅ์ ๋‹จ์ 
black์ฝ”๋“œ ์Šคํƒ€์ผ์„ ์—„๊ฒฉํ•˜๊ฒŒ ํ†ต์ผํ•ด์คŒ- ์„ค์ • ๊ฑฐ์˜ ์—†์ด ๊น”๋”ํ•œ ์Šคํƒ€์ผ
- ์ผ๊ด€์„ฑ ์ตœ๊ณ 
- ๋„ˆ๋ฌด ๊ณ ์ •๋œ ์Šคํƒ€์ผ์ด๋ผ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ์–ด๋ ค์›€
ruffํฌ๋งคํŒ… + ๋ฆฐํŒ… + ์ฝ”๋“œ ์ˆ˜์ •๊นŒ์ง€ ํ†ตํ•ฉ
Rust๋กœ ๊ตฌํ˜„๋˜์–ด ๋งค์šฐ ๋น ๋ฆ„
- ์†๋„ ์ตœ๊ฐ•
- flake8, isort, black ๋“ฑ ๋Œ€์ฒด ๊ฐ€๋Šฅ
- ๊ฑฐ์˜ ๋ชจ๋“  ๋ฆฐํ„ฐ ๋ฃฐ ํฌํ•จ
- ์•„์ง ํฌ๋งคํŒ… ๊ธฐ๋Šฅ์€ black๋งŒํผ ์™„์„ฑ๋˜์ง„ ์•Š์Œ (2025๋…„ ๊ธฐ์ค€)
autopep8PEP8์— ๋งž์ถฐ ์ฝ”๋“œ ์ˆ˜์ •- ๊ฐ€๋ณ๊ณ  ๊ฐ„๋‹จ- ์š”์ฆ˜์€ ๊ฑฐ์˜ ์‚ฌ์šฉ ์•ˆ ํ•จ
- ์ปค๋ฎค๋‹ˆํ‹ฐ ์ง€์› ์•ฝํ•จ

โšช ๋ฆฐํ„ฐ(Linter)๋ž€?

๋ฆฐํ„ฐ๋Š” โ€˜์ฝ”๋“œ์šฉ ๋งž์ถค๋ฒ• & ๋ฌธ๋ฒ• ๊ฒ€์‚ฌ๊ธฐโ€™

  • ๋ฆฐํ„ฐ๊ฐ€ โ€œ์ด ๋ฌธ์žฅ์€ ์ฃผ์–ด์™€ ์„œ์ˆ ์–ด๊ฐ€ ๋งž์ง€ ์•Š๊ณ , ์ € ๋‹จ์–ด๋Š” ์˜คํƒ€๊ฐ€ ๋‚ฌ๋„ค์š”.โ€ ๋ผ๊ณ  ์•Œ๋ ค์ฃผ๋Š” ๊น๊นํ•œ ๊ต์ • ์ „๋ฌธ๊ฐ€๋ผ๋ฉด, ํฌ๋งคํ„ฐ๋Š” โ€œ๊ธ€์ž ๊ฐ„๊ฒฉ, ์ค„ ๋ฐ”๊ฟˆ, ๋“ค์—ฌ์“ฐ๊ธฐ๋ฅผ ๊ทœ์น™์— ๋งž๊ฒŒ ์ž๋™์œผ๋กœ ๋งž์ถฐ์ฃผ๋Š” ํŽธ์ง‘ ๋””์ž์ด๋„ˆโ€ ๊ฐ™์€ ๋А๋‚Œ.
1
2
3
4
5
import os, sys # 1. ํ•œ ์ค„์— ์—ฌ๋Ÿฌ ๋ชจ๋“ˆ import
def myFunction(name): # 2. ํ•จ์ˆ˜ ์ด๋ฆ„์ด snake_case๊ฐ€ ์•„๋‹˜
    unused_variable = "hello" # 3. ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ณ€์ˆ˜
    if name == "chris":
      return "Hello Chris" # 4. ๋“ค์—ฌ์“ฐ๊ธฐ๊ฐ€ 2์นธ์ž„ (PEP 8์€ 4์นธ ๊ถŒ์žฅ)

1): ํ•œ ์ค„์— ์—ฌ๋Ÿฌ ๋ชจ๋“ˆ์„ importํ•˜๋Š” ๊ฑด ์ข‹์ง€ ์•Š์Œ. (E401) 2): ํ•จ์ˆ˜ ์ด๋ฆ„์€ my_function์ฒ˜๋Ÿผ snake_case๋กœ ์จ์•ผ ํ•จ. (N802) 3): unused_variable์ด ์„ ์–ธ๋์ง€๋งŒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Œ. (F841) 4): ๋“ค์—ฌ์“ฐ๊ธฐ๊ฐ€ 4์นธ์ด ์•„๋‹˜. (E111)


โšช ์ถ”์ฒœ ์„ธํŒ…: Ruff + Black ์กฐํ•ฉ

Ruff๋Š” ๋น ๋ฅด๊ณ  ์œ ์—ฐํ•˜์ง€๋งŒ ์•„์ง ํฌ๋งคํŒ… ์™„์„ฑ๋„ ์ธก๋ฉด์—์„œ๋Š” black์ด ๋” ์•ˆ์ •์ . ๊ทธ๋ž˜์„œ ๋‘ ๊ฐœ๋ฅผ ํ•จ๊ป˜ ์“ฐ๋Š” ์กฐํ•ฉ์ด ๊ฐ€์žฅ ๋„๋ฆฌ ์“ฐ์ด๊ณ  ์žˆ์Œ.

1. VSCode ํ™•์žฅ ์„ค์น˜
  • ms-python.python
  • charliermarsh.ruff (Ruff ํ™•์žฅ)
2. VSCode settings.json ์„ค์ •
1
2
3
4
5
6
7
8
9
10
{
  "python.formatting.provider": "black",
  "python.linting.enabled": true,
  "python.linting.ruffEnabled": true,
  "python.linting.ruffArgs": ["--fix"],
  "editor.formatOnSave": true,
  "[python]": {
    "editor.defaultFormatter": "ms-python.black-formatter"
  }
}

์ด ์„ค์ •์€ ์ €์žฅ ์‹œ black์œผ๋กœ ํฌ๋งคํŒ…๋˜๊ณ , ruff๋Š” ์ž๋™์œผ๋กœ ์ฝ”๋“œ ๋ฆฐํŠธ ๋ฐ ์ˆ˜์ •(โ€“fix)๊นŒ์ง€ ์ฒ˜๋ฆฌํ•ด์คŒ.


โšช ๋™์ž‘ ์˜ˆ์‹œ ์ฝ”๋“œ: ํฌ๋งคํŒ…๊ณผ ๋ฆฐํŠธ ์—๋Ÿฌ๊ฐ€ ์„ž์ธ ์ƒํƒœ

์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ๊ทธ๋Œ€๋กœ test_formatter.py ๊ฐ™์€ ํŒŒ์ผ๋กœ ์ €์žฅํ•˜๋ฉด:

  • ๋“ค์—ฌ์“ฐ๊ธฐ ํ‹€๋ฆผ
  • import ์ˆœ์„œ ์•ˆ ๋งž์Œ
  • ์ค„ ๋„ˆ๋ฌด ๊ธบ
  • ๊ด„ํ˜ธ ์Šคํƒ€์ผ ์•ˆ ๋งž์Œ
  • ์“ฐ์ด๊ณ  ์žˆ์ง€ ์•Š์€ ๋ณ€์ˆ˜ ํฌํ•จ
1
2
3
4
5
6
7
8
import sys,os
import numpy as np
import pandas as pd

def    long_function_name( a,b ):
  x =    1+2
  unused_var = 42
  return a+b+ x +   np.sum(np.random.rand(100,100)) + pd.DataFrame({"a":[1,2,3]})

โšช ์ €์žฅ ํ›„ ๊ธฐ๋Œ€ ํšจ๊ณผ: ํฌ๋งคํŒ…๊ณผ ๋ฆฐํŠธ ์—๋Ÿฌ๊ฐ€ ์„ž์ธ ์ƒํƒœ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import os
import sys

import numpy as np
import pandas as pd


def long_function_name(a, b):
    x = 1 + 2
    return (
        a
        + b
        + x
        + np.sum(np.random.rand(100, 100))
        + pd.DataFrame({"a": [1, 2, 3]})
    )

๐Ÿ”ต ์ •๋ฆฌ

  • Black: ์•ˆ์ •์ ์ด๊ณ  ์ผ๊ด€๋œ ์Šคํƒ€์ผ. ๋ณด์ˆ˜์ ์ธ ์„ ํƒ.
  • Ruff: ๋น ๋ฅด๊ณ  ๊ฐ•๋ ฅํ•œ ํ†ตํ•ฉ ๋„๊ตฌ. ์ตœ๊ทผ ํŠธ๋ Œ๋“œ. ๋‹จ๋…์œผ๋กœ ์“ฐ์—ฌ๋„ ์ถฉ๋ถ„ํžˆ ๊ฐ•๋ ฅํ•จ

python ํฌ๋งคํŒ…์„ ํ†ตํ•ด์„œ ์ด์ œ ์ŠคํŠธ๋ ˆ์Šค ๋ฐ›์ง€ ๋ง๊ณ  ์ž๋™ ํฌ๋งทํŒ…์„ ํ•˜์ž.

This post is licensed under CC BY 4.0 by the author.

ยฉ 2025 Soohyun Jeon โญ

๐ŸŒฑ Mostly to remember, sometimes to understand.