Ачааллж байна...
Өмнөх хичээлд бид black-ийг сурсан: кодын хэлбэрийг автоматаар цэгцэлдэг, гэхдээ утгад нь хэзээ ч хүрдэггүй хэрэгсэл. black-ийн хувьд ашиглагдаагүй import, хэзээ ч уншигдаагүй хувьсагч, тодорхойлогдоогүй нэр, аюултай хэв маяг бүгд хэвийн код: тэр зөвхөн зай, хашилтыг хардаг. Энэ хичээлд кодын агуулгыг хардаг хэрэгслийг сурна: ruff. ruff бол linter буюу кодыг ажиллуулалгүйгээр уншиж, магадгүй алдаа, хэрэггүй хэсэг, эрсдэлтэй хэв маягийг олдог хэрэгсэл юм. Python-ий linter-үүдийн дундаас ruff нь хамгийн хурдан бөгөөд сүүлийн жилүүдэд хамгийн өргөн тархсан.
Энэ хичээлд бид ruff-ийг суулгаж, ямар дүрмүүдийг шалгахыг тохиргооны файлд ухамсартайгаар сонгоно. Дараа нь санаатайгаар хэд хэдэн асуудал нуусан файлд ruff ажиллуулж, түүний анхааруулга бүрийг мөр мөрөөр, монголоор уншина. Тэдгээрийн хоёрыг ruff өөрөө засна, үлдсэнийг нь утгыг нь ойлгосны дараа бид гараар засна. Тэдгээрийн нэг нь тестүүд барьж чадаагүй байж болох жинхэнэ алдаа, нөгөө нь Python-ий хамгийн алдартай урхиудын нэг. Эцэст нь linter ба formatter-ийн ялгааг тодорхой болгож, ruff-ийн анхааруулгыг хэзээ, хэрхэн чимээгүй болгохыг шударгаар ярина.
Бичвэрийн хоёр төрлийн туслах бий гэж төсөөлөөрэй. Цэвэр бичээч таны бичвэрийг аваад, мөрийн зай, догол мөр, хуудасны захыг цэгцэлж, гоё харагдуулдаг. Тэр өгүүлбэрийн утгад хэзээ ч хүрэхгүй: хэрвээ та "би маргааш өчигдөр ирнэ" гэж бичсэн бол тэр түүнийг цэвэрхэн, гоё хуудсан дээр яг тэр хэвээр нь үлдээнэ. Хэл зүйн шалгагч өөр: тэр хуудасны хэлбэрийг тоохгүй, харин өгүүлбэр бүрийг уншиж "энд цаг хугацаа зөрчилдөж байна", "энэ үгийг хоёр удаа давтжээ", "энэ нэр өмнө нь хаана ч дурдагдаагүй" гэж захад нь тэмдэглэдэг. Зарим тэмдэглэлийг тэр өөрөө засаж чадна, зарим нь таны шийдвэр шаарддаг.
black бол цэвэр бичээч, ruff бол хэл зүйн шалгагч. Тэд бие биеэ орлодоггүй, харин нөхдөг. black ажиллуулсны дараа код гоё харагдана, ruff ажиллуулсны дараа код утгын хувьд илүү найдвартай болно. Мэргэжлийн төслүүд хоёуланг нь хэрэглэдэг.
Алхам 1: ruff суулгах
VS Code-д pytest-dadlaga фолдероо нээж, venv идэвхтэй эсэхийг шалгаарай.
Command:
pip install ruffГаралт (сүүлийн мөр):
Successfully installed ruff-0.16.0pytest, black-ээс ялгаатай нь ruff ганцаараа, ямар ч хамаарлгүйгээр суусан. ruff нь Python-оор биш, Rust гэдэг хэлээр бичигдсэн бөгөөд нэг бэлэн программ хэлбэрээр ирдэг. Энэ нь түүнийг маш хурдан болгодог: том төслийн мянга мянган файлыг секундын хэсэгт шалгадаг. Таны хувилбар илүү шинэ байж болно.
Command:
ruff --versionГаралт:
ruff 0.16.0Алхам 2: Дүрмүүдээ сонгох
Linter бүр дүрмүүдийн цуглуулгаар ажилладаг. Дүрэм бүр нэг төрлийн асуудлыг илрүүлдэг бөгөөд үсэг, тооноос бүрдсэн кодтой. ruff-д мянга орчим дүрэм бий. Тэдгээрийг бүлгээр нь сонгодог: кодын эхний үсгүүд бүлгийг заадаг. Энэ хичээлд бид дөрвөн бүлгийг сонгоно. F бүлэг: тодорхой алдаа, жишээ нь ашиглагдаагүй import, тодорхойлогдоогүй нэр. E бүлэг: PEP 8-ийн үндсэн хэв маягийн дүрмүүд. B бүлэг: түгээмэл урхи, алдаанд хүргэдэг хэв маягууд. I бүлэг: import-уудын дараалал.
Яагаад өөрсдөө сонгох вэ? ruff-ийн шинэ хувилбарууд тохиргоогүй үед хэдэн зуун дүрмийг анхдагчаар асаадаг бөгөөд тэдгээрийн тоо, бүрэлдэхүүн хувилбараас хувилбарт өөрчлөгддөг. Тохиргоогүй ажиллуулбал таны төсөл өнөөдөр нэг анхааруулгатай, ruff-ийг шинэчилсний дараа зуун анхааруулгатай болж магадгүй. ruff-ийн өөрийн баримт бичиг ч жижиг, тодорхой дүрмийн багцаар эхэлж, хэрэгцээгээр нь бүлэг нэмэхийг зөвлөдөг. Шалгах дүрмүүдээ ухамсартайгаар сонгох нь мэргэжлийн дадал: таны тохиргоо таны төслийн стандартыг баримтжуулдаг.
ruff-ийн тохиргоо pyproject.toml гэдэг файлд байрладаг. Энэ бол Python төслүүдийн тохиргооны стандарт файл бөгөөд олон хэрэгсэл, тэр дундаа 11.1 дүгээр хичээлд дурдсан black, өөрийн тохиргоог тэнд уншдаг. Өргөтгөл нь “.toml”: энгийн, уншигдахуйц тохиргооны хэл. pytest-dadlaga-ийн үндсэнд pyproject.toml үүсгэнэ үү.
toml
[tool.ruff]
output-format = "concise"
[tool.ruff.lint]
select = ["E", "F", "B", "I"]Дөрвөлжин хаалтан доторх мөрүүд хэсгийн гарчиг, 8.1 дүгээр хичээлийн pytest.ini-ийн “[pytest]”-тэй ижил санаа. “[tool.ruff]” нь ruff-ийн ерөнхий тохиргоо: “output-format = “concise”” нь анхааруулга бүрийг нэг мөрөөр, товч харуулахыг заана. ruff-ийн анхдагч гаралт илүү дэлгэрэнгүй: кодын хэсэг, засварын санал зэргийг харуулдаг. Товч хэлбэр эхэлж суралцахад уншихад хялбар. “[tool.ruff.lint]” нь linter-ийн тохиргоо: “select” сонгосон дөрвөн бүлгийг жагсаана.
Алхам 3: Асуудалтай файл
Үндсэн фолдерт lint_demo.py нэртэй файл үүсгэж, дараах кодыг яг ингэж бичнэ үү. Энэ код black-ийн хэлбэрт нийцдэг, цэвэрхэн харагддаг. Гэхдээ дотор нь хэд хэдэн асуудал нуусан.
python
import os
import json
def to_json(items):
return json.dumps(items, ensure_ascii=False)
def total_price(items, discounts=[]):
total = 0
for name, price, qty in items:
line = price * qty
total += price * qty
return total - sum(discounts)
def find_price(items, wanted):
for item in items:
if item[0] == wanted:
return item[1]
return missing_valueCommand:
python -c "from lint_demo import total_price; print(total_price([('талх', 2000, 2)]))"Гаралт:
4000Файл алдаагүй ачаалагдаж, функц зөв хариу өгч байна. Энэ код ажилладаг мэт харагдаж байна.
Алхам 4: ruff ажиллуулах
Command:
ruff check lint_demo.pyГаралт:
lint_demo.py:1:1: I001 [*] Import block is un-sorted or un-formatted
lint_demo.py:1:8: F401 [*] `os` imported but unused
lint_demo.py:9:34: B006 Do not use mutable data structures for argument defaults
lint_demo.py:11:9: B007 Loop control variable `name` not used within loop body
lint_demo.py:12:9: F841 Local variable `line` is assigned to but never used
lint_demo.py:21:12: F821 Undefined name `missing_value`
Found 6 errors.
[*] 2 fixable with the `--fix` option (3 hidden fixes can be enabled with the `--unsafe-fixes` option).Зургаан анхааруулга. Мөр бүр ижил бүтэцтэй тул эхлээд бүтцийг ойлгоё. “lint_demo.py:9:34:” нь файл, мөр, багана: 9 дүгээр мөрийн 34 дүгээр тэмдэгт. Энэ байрлал 10.3 дугаар хичээлийн traceback-ийн мөрийн дугаараас ч нарийн. VS Code-ийн terminal-д энэ хэсэг дээр Ctrl дарж байгаад дарвал файл яг тэр газар нээгдэнэ. Дараа нь дүрмийн код, жишээ нь “B006”. Хэрвээ “[*]” тэмдэг байвал ruff энэ асуудлыг өөрөө аюулгүйгээр засаж чадна гэсэн утгатай. Эцэст нь асуудлын тайлбар.
Доод хоёр мөр нэгтгэл. “Found 6 errors.” нь “6 алдаа олдлоо”. Хоёр дахь мөр “2 нь --fix-ээр засагдах боломжтой” гэж хэлээд, хаалтан дотор "өөр 3 нуугдмал засварыг --unsafe-fixes-ээр идэвхжүүлж болно" гэж нэмж байна. “unsafe” буюу "аюултай" засвар гэдэг нь программын зан төлөвийг өөрчилж болзошгүй засвар: ruff тэдгээрийг таны зөвшөөрөлгүйгээр хэзээ ч хийдэггүй. Таны ruff-ийн хувилбараас хамаараад хаалтан доторх тоо бага зэрэг өөр байж болно.
Одоо анхааруулга бүрийг дарааллаар нь уншъя.
Анхааруулга бүрийн утга
I001: Import block is un-sorted or un-formatted. “Import-уудын блок эрэмбэлэгдээгүй эсвэл хэлбэржээгүй”. Python-ий заншлаар import-ууд тогтсон дарааллаар байх ёстой: эхлээд стандарт сан, дараа нь суулгасан package-ууд, эцэст нь төслийн өөрийн модулиуд, бүлэг бүрийн дотор цагаан толгойн дарааллаар. Манай файлд “os” “json”-ийн өмнө байна, цагаан толгойгоор эсрэгээрээ байх ёстой. Энэ нь алдаа биш, эмх цэгц. Гэхдээ том төсөлд тогтсон дараалал import-уудыг олоход тусалж, 6.2 дугаар хичээлийн хэлбэрийн маргааныг import-ууд дээр ч арилгадаг. “[*]” бий: ruff засна.
F401: os imported but unused. “os import хийгдсэн ч ашиглагдаагүй”. Файлд os хаана ч хэрэглэгдээгүй. Ийм import кодыг дэмий урт болгож, уншигчийг “os энд юунд хэрэгтэй юм бол” гэж хайлгадаг. Ихэнхдээ энэ нь кодыг өөрчлөх явцад үлдсэн үлдэгдэл. “[*]” бий: ruff устгана.
B006: Do not use mutable data structures for argument defaults. "Аргументын анхдагч утгад өөрчлөгдөх боломжтой өгөгдлийн бүтэц бүү хэрэглэ". Энэ бол Python-ий хамгийн алдартай урхиудын нэг тул доор тусад нь дэлгэрэнгүй тайлбарлана. Байрлал нь 9:34: discounts=[]-ийн хоосон жагсаалт.
B007: Loop control variable name not used within loop body. "Давталтын хувьсагч name давталтын биед ашиглагдаагүй". total_price-ийн давталт tuple бүрийг name, price, qty болгон задалдаг ч name хэзээ ч хэрэглэгдээгүй. Энэ нь алдаа биш байж болох ч ихэнхдээ хоёрын нэг: эсвэл хэн нэгэн name-ийг хэрэглэхээ мартсан, эсвэл хэрэггүй хувьсагч уншигчийг төөрөгдүүлж байна.
F841: Local variable line is assigned to but never used. "Дотоод хувьсагч line утга авсан ч хэзээ ч ашиглагдаагүй". 12 дугаар мөрөнд line тооцоологдсон ч дараагийн мөр яг ижил тооцоог дахин хийж, line-ийг огт хэрэглэхгүй. Энэ нь кодыг засах явцад үлдсэн мөр байх магадлалтай. Хор хөнөөлгүй мэт ч уншигчийг “line яагаад хэрэгтэй юм бол” гэж бодуулдаг.
F821: Undefined name missing_value. "Тодорхойлогдоогүй нэр missing_value". Энэ бол жинхэнэ алдаа. find_price-ийн сүүлийн мөр missing_value-г буцаах гэж оролддог ч ийм нэр хаана ч тодорхойлогдоогүй. Python энэ мөрт хүрэх үед NameError гаргаж унана. Хэзээ хүрэх вэ? Зөвхөн хайж буй бараа олдохгүй үед. Хэрвээ бүх тест, бүх гар шалгалт байгаа барааг хайсан бол энэ алдаа хэзээ ч илрэхгүй, хэрэглэгч байхгүй бараа хайх хүртэл. ruff үүнийг кодыг огт ажиллуулалгүйгээр олсон. Энэ бол linter-ийн тестээс ялгаатай хүч: 7.1 дүгээр хичээлд "харуул зөвхөн жагсаалтад байгаа хаалгуудыг шалгадаг" гэж хэлсэн. ruff бол барилгын бүх хаалгыг зураг дээр нь шалгадаг байцаагч: хаалга бүр онгойж, хаагдах ёстой эсэхийг биш, гэхдээ ядаж хаалга бүр бүрэн суурилагдсан эсэхийг.
B006: хамгийн алдартай урхи
def total_price(items, discounts=[]) мөр яагаад аюултай вэ? Python функцийн анхдагч утгыг функц дуудагдах бүрт биш, функц тодорхойлогдох үед нэг л удаа үүсгэдэг. Тэгэхээр [] жагсаалт ганцхан удаа үүсч, discounts-гүйгээр дуудсан бүх дуудлага тэр нэг жагсаалтыг хуваалцдаг. Хэрвээ функц тэр жагсаалтыг хэзээ нэгэн цагт өөрчилбөл, жишээ нь append хийвэл, өөрчлөлт дараагийн бүх дуудлагад үлдэнэ.
Жишээ болгон доорх функцийг уншаарай.
python
def add_discount(amount, discounts=[]):
discounts.append(amount)
return discountsЭхний удаа add_discount(100) дуудахад [100] буцаана, хүлээгдсэн ёсоор. Хоёр дахь удаа add_discount(200) дуудахад [200] биш, [100, 200] буцаана: эхний дуудлагын 100 хуваалцсан жагсаалтад үлдсэн. Энэ бол 8.2 дугаар хичээлд fixture тест бүрт шинэ хуулбар өгдгийн яг эсрэг тохиолдол, мөн 9.2 дугаар хичээлийн "өгсөн утгыг өөрчлөх" гаж нөлөөний хамгийн нууцлаг хэлбэр. Манай total_price одоохондоо discounts-ийг өөрчилдөггүй тул алдаа гараагүй. Гэхдээ хэн нэгэн хожим функцийг өөрчлөхөд энэ урхи нээгдэнэ. ruff үүнийг урьдчилан анхааруулж байна.
Алхам 5: ruff-ээр засуулах
“[*]” тэмдэгтэй хоёр асуудлыг ruff-ээр засуулъя.
Command:
ruff check --fix lint_demo.pyГаралт:
lint_demo.py:8:34: B006 Do not use mutable data structures for argument defaults
lint_demo.py:10:9: B007 Loop control variable `name` not used within loop body
lint_demo.py:11:9: F841 Local variable `line` is assigned to but never used
lint_demo.py:20:12: F821 Undefined name `missing_value`
Found 6 errors (2 fixed, 4 remaining).
No fixes available (3 hidden fixes can be enabled with the `--unsafe-fixes` option).“Found 6 errors (2 fixed, 4 remaining)” нь “6 алдаа олдсон (2 засагдсан, 4 үлдсэн)” гэсэн утгатай. VS Code-д файлын эхийг хараарай: import os мөр алга болж, зөвхөн import json үлдсэн. Нэг мөр устсан тул үлдсэн анхааруулгуудын мөрийн дугаар нэгээр багассаныг анзаараарай: 9 нь 8, 21 нь 20 болсон. Хоёр дахь мөр "аюулгүй засвар үлдээгүй" гэж хэлж байна.
Үлдсэн дөрвийг ruff яагаад засаагүй вэ? Учир нь тэдгээрийн зөв засвар таны санаанаас хамаарна. missing_value-ийн оронд юу буцаах ёстой вэ: None, 0, эсвэл алдаа гаргах уу? Үүнийг зөвхөн та мэднэ. Энэ бол хэл зүйн шалгагчийн "энэ нь таны шийдвэр" гэсэн тэмдэглэл.
Алхам 6: Үлдсэнийг гараар засах
Дөрвөн асуудлыг ойлгосон тул засцгаая. total_price-ийг дараах байдлаар өөрчилнө үү.
python
def total_price(items, discounts=()):
total = 0
for _name, price, qty in items:
total += price * qty
return total - sum(discounts)Гурван өөрчлөлт. Анхдагч утга []-ээс () болсон: tuple өөрчлөгдөх боломжгүй тул хуваалцсан ч аюулгүй, sum() ч хоосон tuple-тэй ажилладаг. Энэ бол B006-ийн хамгийн энгийн засвар. Өөр түгээмэл засвар бол discounts=None болгож, функцийн дотор if discounts is None: discounts = [] гэж шинэ жагсаалт үүсгэх. name нь _name болсон: Python-ий заншлаар доогуур зураасаар эхэлсэн нэр "энэ хувьсагчийг санаатайгаар хэрэглэхгүй" гэсэн дохио бөгөөд ruff үүнийг хүлээн зөвшөөрдөг. line-ийн мөр устсан: ашиглагдаагүй үлдэгдэл.
find_price-ийн сүүлийн мөрийг өөрчилнө үү.
python
return NoneБараа олдохгүй үед None буцаах нь энэ функцийн гэрээ гэж бид шийдлээ. Дуудагч if price is None: гэж шалгана. 8.4 дүгээр хичээлийн аргаар алдаа гаргах нь ч зөв сонголт байж болох бөгөөд энэ шийдвэр таных.
Command:
ruff check lint_demo.pyГаралт:
All checks passed!"Бүх шалгалт давлаа". Black-ийн хэлбэртэй нийцэж байгааг ч шалгая.
Command:
black --check lint_demo.pyГаралт:
All done!
1 file would be left unchanged.Хоёр хэрэгсэл хоёулаа сэтгэл хангалуун.
Бүхэл төслийг шалгах
Command:
ruff check .Хэрвээ таны бүх import-ууд эрэмбэлэгдсэн бол гаралт:
All checks passed!Хэрвээ аль нэг файлд import-ын дараалал зөрсөн бол, жишээ нь 9.2 дугаар хичээлд test_receipt.py-ийн import мөрөнд шинэ нэрсийг төгсгөлд нь нэмсэн бол, гаралт дараах мэт байж болно.
tests\test_receipt.py:1:1: I001 [*] Import block is un-sorted or un-formatted
Found 1 error.
[*] 1 fixable with the `--fix` option.Энэ тохиолдолд ruff check --fix . нь import-уудыг эрэмбэлнэ, дараа нь pytest ажиллуулж бүх тест давсаар байгааг батлаарай. black-ийн нэгэн адил ruff venv фолдерыг алгасаж, .gitignore-ийг уншдаг.
linter ба formatter: хуваарь
Одоо бидэнд хоёр хэрэгсэл бий тул тэдгээрийн хуваарийг тодорхой болгоё. black хэлбэрийг шийддэг: зай, хашилт, мөрийн урт, хоосон мөр. Тэр утгад хэзээ ч хүрдэггүй. ruff агуулгыг шалгадаг: ашиглагдаагүй зүйл, тодорхойлогдоогүй нэр, аюултай хэв маяг. Түүний зарим засвар кодын утгыг бага зэрэг өөрчилдөг, жишээ нь import устгах, тиймээс ruff "аюулгүй" ба "аюултай" засваруудыг ялгадаг.
Өдөр тутмын дараалал: эхлээд ruff check --fix ., дараа нь black ., эцэст нь pytest. ruff эхэнд, учир нь түүний засварууд, жишээ нь import устгах, хоосон мөр үлдээж болох бөгөөд black тэднийг цэгцэлнэ. pytest сүүлд, учир нь хоёр хэрэгслийн өөрчлөлтийн дараа бүх зүйл ажилласаар байгааг батлах ёстой.
Шударга нэг мэдээлэл: ruff-д black-тэй бараг ижил хэлбэр гаргадаг өөрийн formatter бий, ruff format command. Сүүлийн жилүүдэд олон шинэ төсөл black-ийн оронд түүнийг хэрэглэж, нэг хэрэгслээр хоёр ажлыг хийдэг болсон. Энэ сургалт black-ийг сонгосон, учир нь тэр бол Python-ий хэлбэржүүлэлтийн сонгодог стандарт бөгөөд таны уншиж буй олон төсөлд түүнийг харна. Хоёулангийн хэлбэр бараг ижил тул нэгийг нь мэдсэн хүн нөгөөг нь шууд ашиглана.
Анхааруулгыг чимээгүй болгох
Заримдаа ruff-ийн анхааруулга буруу эсвэл тухайн тохиолдолд хамаагүй байдаг. Жишээ нь санаатайгаар үлдээсэн import. Тийм үед мөрийн төгсгөлд тусгай тайлбар нэмж тухайн дүрмийг тэр мөрөнд чимээгүй болгож болно.
python
import os # noqa: F401“noqa” нь “no quality assurance” буюу "чанарын шалгалтгүй" гэдгээс гаралтай. Хоёр цэгийн дараа чимээгүй болгох дүрмийн код. ruff-ийн шинэ хувилбарууд ижил үүрэгтэй # ruff: ignore[F401] гэсэн хэлбэрийг ч дэмждэг. Хоёулаа ажилладаг.
Гэхдээ энэ хэрэгслийг маш цөөн хэрэглэ. Анхааруулга бүрийн 99 хувьд зөв хариу бол кодыг засах, чимээгүй болгох биш. Хэрвээ та чимээгүй болгох бол яагаад гэдгийг тайлбарт бичээрэй, жишээ нь # noqa: F401 # re-exported for other modules. Ялангуяа F821 зэрэг F бүлгийн дүрмүүдийг чимээгүй болгох нь бараг хэзээ ч зөв биш: тэд жинхэнэ алдааг заадаг. 7.4 дүгээр хичээлийн "тестийг кодонд тааруулж засах" аюултай адил, анхааруулгыг чимээгүй болгох нь асуудлыг нуух.
VS Code-д шууд харах
ruff-ийг command-аар ажиллуулахаас гадна VS Code-д кодыг бичих явцад шууд харуулж болно. Microsoft биш, Astral компанийн “Ruff” өргөтгөлийг Extensions самбараас хайж суулгана уу. Үүний дараа ruff-ийн анхааруулгууд кодын доор долгионт зураасаар шууд харагдаж, хулганаа аваачихад тайлбар гарна. Өргөтгөл таны pyproject.toml-ийн тохиргоог уншдаг. Энэ нь асуудлыг кодыг хадгалахаас ч өмнө олох боломж олгодог.
Хүсвэл зарлагын бүртгэлдээ ruff-ийг туршаад үзээрэй. Тэр төслийн үндсэнд энэ хичээлийн pyproject.toml-ийг хуулж тавиад, venv-д ruff суулгаж, ruff check . ажиллуулаарай. Анхааруулга бүрийг энэ хичээлийн аргаар уншаад, засах хэрэгтэй юу гэдгийг өөрөө шийдээрэй. Дараа нь pytest ажиллуулаарай. Хэрвээ өөрчлөлт гарсан бол 11.1 дүгээр хичээлийн зөвлөгөөгөөр түүнийг тусдаа салаа, тусдаа commit-оор, магадгүй pull request-ээр хийж, requirements-dev.txt-д “ruff” нэмээрэй. Хүсвэл select-д “UP” бүлгийг нэмж, ruff юу санал болгохыг харж болно: тэр бүлэг кодыг Python-ий шинэ хувилбаруудын илүү орчин үеийн хэлбэр рүү шилжүүлэхийг санал болгодог.
ruff танигдахгүй байх. 7.2 болон 11.1 дүгээр хичээлүүдийн асуудалтай ижил: venv идэвхгүй эсвэл ruff энэ venv-д суугаагүй. “(venv)”-ийг шалгаад Алхам 1-ийг давтана уу.
Тохиргоо уншигдахгүй байх. Хэрвээ ruff таны сонгоогүй дүрмүүдийн анхааруулга, жишээ нь UP эсвэл SIM-ээр эхэлсэн кодууд, гаргаж эсвэл гаралт товч хэлбэрээр биш бол ruff pyproject.toml-ийг олоогүй эсвэл уншиж чадаагүй. Файл төслийн үндсэнд байгаа эсэх, нэр нь яг “pyproject.toml” эсэх, хэсгийн гарчгууд “[tool.ruff]” ба “[tool.ruff.lint]” гэж зөв бичигдсэн эсэхийг шалгаарай. Хэрвээ файлд синтаксийн алдаа байвал ruff “Failed to parse” гэсэн үгтэй мессежээр зогсоож, файлын нэр болон алдааны мөрийг заана.
Анхааруулгыг ойлгохгүйгээр засах. ruff-ийн анхааруулгыг арилгах хамгийн хурдан арга заримдаа хамгийн буруу нь. Жишээ нь F821-ийг арилгахын тулд файлын дээд хэсэгт missing_value = None гэж нэмж болно: анхааруулга алга болно, гэхдээ функцийн гэрээний тухай шийдвэр гаргаагүй. Анхааруулга бүрийн утгыг эхлээд ойлгоорой. Дүрмийн кодын утгыг мэдэхгүй бол ruff rule B006 command тэр дүрмийн бүрэн тайлбарыг, ихэнхдээ жишээтэй нь, харуулна.
--unsafe-fixes-ийг шалгалтгүй хэрэглэх. Нуугдмал "аюултай" засварууд программын зан төлөвийг өөрчилж болзошгүй учраас ruff тэдгээрийг анхдагчаар хийдэггүй. Хэрвээ та --unsafe-fixes-ийг хэрэглэх бол эхлээд --diff-тэй хамт ажиллуулж, юу өөрчлөгдөхийг 11.1 дүгээр хичээлийн black-ийн аргаар хар, дараа нь хэрэглэ, эцэст нь тест ажиллуул. Олон тохиолдолд эдгээр асуудлыг Алхам 6 шиг гараар засах нь илүү ойлгомжтой.
Олон анхааруулгыг нэг commit-д засах. Хуучин төсөлд ruff-ийг анх удаа ажиллуулахад олон арван анхааруулга гарч болно. 11.1 дүгээр хичээлийн зарчим энд ч хамаатай: --fix-ийн автомат засваруудыг нэг commit, гараар хийсэн утга бүхий засваруудыг тус бүрд нь эсвэл бүлгээр нь тусдаа commit болгох нь pull request-ийг хянахад хялбар болгоно.
ruff бол linter: кодыг ажиллуулалгүйгээр уншиж, магадгүй алдаа, хэрэггүй хэсэг, эрсдэлтэй хэв маягийг олдог хэл зүйн шалгагч, харин black хэлбэрийг цэгцэлдэг цэвэр бичээч. ruff-ийг venv-д pip install ruff-ээр суулгана. Түүний дүрмүүд бүлгүүдэд хуваагдсан бөгөөд шинэ хувилбарууд анхдагчаар олон зуун дүрэм асаадаг тул шалгах бүлгүүдийг pyproject.toml-ийн [tool.ruff.lint] select-д ухамсартайгаар сонгоно: F тодорхой алдаа, E хэв маяг, B урхи, I import-ын дараалал. output-format = "concise" нь анхааруулга бүрийг "файл:мөр:багана: код [] тайлбар" хэлбэрээр нэг мөрөнд харуулдаг, “[]” нь ruff аюулгүй засаж чадна гэсэн утгатай. ruff check --fix аюулгүй засваруудыг хийдэг, бусад нь таны шийдвэр шаарддаг. F821 тодорхойлогдоогүй нэр зэрэг тестүүдийн хүрээгүй алдааг ruff ажиллуулалгүйгээр олдог. B006 өөрчлөгдөх анхдагч утга бол функц тодорхойлогдох үед нэг удаа үүсч, бүх дуудлагад хуваалцагддаг урхи. Өдөр тутмын дараалал: ruff check --fix ., black ., pytest. # noqa: КОД ба # ruff: ignore[КОД] анхааруулгыг чимээгүй болгодог ч маш цөөн, шалтгаантай нь хэрэглэнэ. ruff rule КОД дүрэм бүрийн тайлбарыг харуулдаг.
Дараагийн хичээлд хэрэгслүүдээс хүний шийдвэр рүү шилжинэ. black ба ruff таны кодыг хэлбэржүүлж, урхиас сэрэмжлүүлэх ч кодыг ойлгомжтой болгодог хамгийн чухал шийдвэрүүдийг тэд гаргаж чадахгүй: хувьсагчийг юу гэж нэрлэх, функцийг хэр урт байлгах, хэзээ хуваах. PEP 8-ийн гол санааг энгийн үгээр сурч, өөрийгөө тайлбарладаг нэрийн тухай ярина.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.