[Python] ruff: lint & formatter
ruff๋ uv ๋ฑ์ ํต์ฌ ๋ณด์กฐ๋๊ตฌ๋ฅผ ๋ง๋ astral ๊ทธ๋ฃน์ ๋๋ค๋ฅธ ์ญ์์ด๋ค.
์๋ ๋ถ์คํ๊ฑฐ๋ ์ด์ ์ฉกํ๋ lint+formatter ํ๊ฒฝ์ ํตํฉ๋ ํํ๋ก ์ ๊ณตํ๋ ๋ฆฐํธ ๋๊ตฌ๋ค.
๋น ๋ฅธ ์ฑ๋ฅ๊ณผ ๋ค์ํ ๊ท์น ์ง์, lint+formatter๊ฐ ํตํฉ๋ ๊ธฐ๋ฅ, ์ฌ์ฉ ํธ์์ฑ์ ๊ธฐ์กด ๋๊ตฌ๋ค๊ณผ ์ฐจ๋ณํ๋๋ ์ฅ์ ์ผ๋ก ์ผ๋๋ค.
https://docs.astral.sh/ruff/
์ด๊ฑด astral์์ ๋ด๋์ ๋ฒค์น๋งํฌ๋ผ ์ข ๋ถ๊ณต์ ํ ๋ถ๋ถ์ด ์์ ์๋ ์๋๋ฐ, ๋น ๋ฅด๊ธด ๋น ๋ฅธ ๊ฒ ๊ฐ๋ค.
ํ์คํ ์ ์ ์๋ ๊ฑด pylint๊ฐ ๊ฐ์ฅ ๋๋ฆฌ๋ค๋ ๊ฒ์ด๋ค.
์ค์น (CLI)
uv๋ฅผ ์ด๋ค๊ณ ๊ฐ์ ํ๋ค.
์ค์น๋ ๋ณ๊ฑฐ ์๋ค.
uv add --dev ruff

๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ (CLI)
์ด๋ฐ ์ฝ๋๊ฐ ํ๋ ์๋ค๊ณ ๊ฐ์ ํ๊ฒ ๋ค.
import os
def Fibonacci(n):
if n <= 0:
return 0
elif n == 1:
return 1
return Fibonacci(n-1) + Fibonacci(n-2)
if __name__ == "__main__":
num = 10
print(f"Fibonacci number at position {num} is {Fibonacci(num)}")uv run ruff check ํ์ผ๋ช

ํ์ผ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ์ง ์์ ๊ฒฝ์ฐ์๋, ํ์ฌ ๊ฒฝ๋ก๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์์ ๋ค ์ฐพ์์ ์ฒดํฌํ๋ค.

auto fix ๊ธฐ๋ฅ
๋ชจ๋ lint ํญ๋ชฉ์ ๋ํด์ ์ง์๋๋ ๊ฒ์ ์๋์ง๋ง, ์ผ๋ฐ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ ๊ฒฝ๊ณ ํญ๋ชฉ์ ์๋์ผ๋ก ์์ ๋๊ฒ ์ฒ๋ฆฌํ ์๋ ์๋ค.
์์์ ๋ฐ์ํ unused import ๊ฐ์ ๊ฒฝ์ฐ์๋ check๋ฅผ ๋๋ฆด๋ --fix ํ๋๊ทธ๋ฅผ ๋ฃ์ผ๋ฉด ์ ๊ณ ์ณ์ค๋ค.


formatting ๊ธฐ๋ฅ
ruff๋ ๋ค๋ฅธ lint ๋๊ตฌ๋ค๊ณผ๋ ๋ค๋ฅด๊ฒ, ํฌ๋งทํฐ ๊ธฐ๋ฅ๋ ํจ๊ป ์ ๊ณตํ๋ค. check ๋์ format ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
์ด๋ฐ ์ฝ๋๊ฐ ์๋ค๋ฉด
<br>
def Fibonacci(n):
if n <= 0:
return 0
elif n == 1:
return 1
return Fibonacci(n - 1) + Fibonacci(n - 2)
foo = Fibonacci(1) + Fibonacci(2) + Fibonacci(3) + Fibonacci(4) + Fibonacci(5) + Fibonacci(6) + Fibonacci(7) + Fibonacci(8) + Fibonacci(9) + Fibonacci(10)
print(foo)
if __name__ == "__main__":
num = 10
print(f"Fibonacci number at position {num} is {Fibonacci(num)}")
๋๋ ธ์๋
uv run ruff format

์ด๋ ๊ฒ ์์๊ฒ ์ ๋ง์ถฐ์ค ๊ฒ์ด๋ค.
์ด ๊ฒฝ์ฐ ๊ฐ์ ๊ฐํ, ํ์ดํธ์คํ์ด์ค ์ ๊ฑฐ ๋ฑ์ด ์ฒ๋ฆฌ๋๋ค.
๊ท์น ๊ด๋ฆฌ
lint ๊ท์น์ uv๋ฅผ ์ธ ๊ฒฝ์ฐ pyproject.toml๋ก ๊ด๋ฆฌํ ์ ์๊ณ , ๊ทธ๊ฒ ์๋๋ผ๋ฉด ruff.toml๋ก ๊ด๋ฆฌํ ์ ์๋ค.
์ฌ๊ธฐ์๋ ์ ์๋ฅผ ์ด๋ค๊ณ ๊ฐ์ ํ๋ค.
์ผ๋จ, ruff๋ ๊ท์น์ ๋ฐ๋ก ์ค์ ํ์ง ์๋๋ค๋ฉด formatting์ black ๊ท์น์ ๋ฐ๋ฅด๊ณ , lint๋ Flake8์ F ๊ท์น์ ๋ฐ๋ฅธ๋ค. Flake8๋ PEP8 ๊ธฐ์ค์ ํ์ค ์ปจ๋ฒค์ ์ ์งํฅํ๋ lint๋ค.
๊ท์น ์ถ๊ฐ๋ ์ด๋ฐ ์์ผ๋ก ํ ์ ์๋ค.
์ด๋ฌ๋ฉด ํ ์ค์ 79์ ๋ฏธ๋ง์ผ๋ก ์ ์ง๊ฐ ๋๋๋ก ํฌ๋งทํ
์ ํ๊ฒ ๋ค๋ ๋ป์ด๋ค.
๊ทธ๋ฆฌ๊ณ E501๋ผ๋ ๋ฆฐํธ ๋ฃฐ์ ์ถ๊ฐํ๋ฉด ์ line-length ๊ฐ์ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์์ ์ค์ ๋ก ๋ฆฐํธ๋ฅผ ๋๋ฆฌ๊ฒ ๋๋ค.
์ ์ ์ฒด ๊ท์น ๋ชฉ๋ก์ ๋ค์ ํ์ด์ง์์ ํ์ธํ ์ ์๋ค.
https://docs.astral.sh/ruff/rules/
ํฌ๋งคํ ๊ท์น์ tool.ruff.format ์ ๋ก ๊ด๋ฆฌํ ์ ์๋ค.

ํฌ๋งคํ
๊ท์น์ ๋ค์ ๋ฌธ์์์ ์ฐธ์กฐํ๋ฉด ๋๋ค.
https://docs.astral.sh/ruff/settings/#format
์๋ํฐ ํตํฉ (VSCode)
VSCode์ ๊ฒฝ์ฐ์๋ ํ์ฅ์ ํํ๋ก ์ง์ํ๋ค.
์ค์น ํ์ ํน๋ณํ ๋ญ๊ฐ ์ค์ ํด์ผ ํ๋ ๊ฒ์ ์๋ค.
๊ทธ๋ผ format on save๋ ๋๊ณ ,

lint ๊ฐ์ํ๋ ์ ํด์ค ๊ฒ์ด๋ค.

์ฐธ์กฐ
https://docs.astral.sh/ruff/