[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/