Ачааллж байна...
Энэ бүлгийн гурван хичээлд бид олон type hint бичиж, тэр болгонд нэг амлалт давтсан: “mypy үүнийг илрүүлнэ”. total_price("1500", 3) ажиллах үед утгагүй үр дүн өгсөн, “order_place” гэсэн үсгийн алдаа чимээгүй өнгөрсөн, Stack[int]-д string нэмэгдсэн, Banner буруу гарын үсэгтэй draw-тайгаар render_all-д орсон. Энэ хичээлд тэр амлалтыг биелүүлнэ. Бид mypy-г суулгаж, тэдгээр бүх алдааг нэг файлд цуглуулж, mypy-г ажиллуулаад, түүний мессеж бүрийг Монгол хэлээр мөр мөрөөр нь уншиж, засна.
mypy бол static type checker буюу "статик төрлийн шалгагч". “Static” гэдэг нь "кодыг ажиллуулалгүйгээр" гэсэн утгатай: mypy таны програмыг огт эхлүүлэхгүй, зөвхөн кодыг уншиж, hint-үүдийг хооронд нь тулгана. Тэгэхээр тэр ажиллах үед хэзээ ч хүрэхгүй салаануудыг, тестэд орхигдсон тохиолдлуудыг ч шалгана. Course 4-т та ruff linter-ийг хэрэглэсэн: ruff хэв маяг ба түгээмэл алдааг шалгадаг бол mypy төрлүүдийн нийцлийг шалгадаг. Тэд бие биенээ орлохгүй, нөхдөг.
Хичээлийн хоёр дахь хагас шударга зөвлөмжид зориулагдсан. mypy-ийн анхдагч тохиргоо hint-гүй функцүүдийг огт шалгадаггүй бөгөөд энэ нь олон хүнийг гайхшруулдаг. Бид үүнийг харуулж, тохиргоог pyproject.toml-д хэрхэн бичихийг сурна. Эцэст нь hint хамгийн их үр өгөх нөхцөлийг харна: том кодыг дахин бүтэцлэх үе, тест ч бүх газрыг хамарч чадахгүй үед.
Шинэ байшин барьж байгаа хүнийг төсөөлөөд үзээрэй. Хоёр төрлийн шалгалт бий. Эхнийх нь нүүж орсны дараа: та амьдарч байх үедээ хана хагарахыг, ус гоожихыг олж мэднэ. Энэ бол ажиллах үеийн алдаа, traceback: асуудал бодит, хохирол аль хэдийн учирсан. Хоёр дахь нь барилга эхлэхээс өмнө: инженер зураг төслийг ширээн дээр дэлгэж, "энэ дам нуруу энэ ачааллыг даахгүй", "энэ хоолой энэ ханан дотуур явах боломжгүй" гэж тулгаж шалгана. Байшин хараахан байхгүй ч зураг дээрх зөрчлүүд аль хэдийн харагдана.
mypy бол зураг төслийн инженер. Таны type hint-үүд бол зураг дээрх хэмжээсүүд: "энэ хоолой 20 миллиметр", "энэ функц int хүлээдэг". Инженер хэмжээсүүдийг хооронд нь тулгаж, таарахгүй газрыг тэмдэглэнэ. Инженерийн хоёр хязгаарлалтыг анзаараарай. Нэгдүгээрт, хэмжээс бичигдээгүй газрыг тэр шалгаж чадахгүй: hint-гүй функц бол хэмжээсгүй зураг. Хоёрдугаарт, тэр барилгын үеийн бүх асуудлыг урьдчилан харахгүй: ажилчид буруу материал авчирч болно. Энэ нь гаднаас ирэх өгөгдөл: файл, API, хэрэглэгч. Тэдгээрт Хичээл 10.1-ийн ажиллах үеийн шалгалт хэрэгтэй хэвээр.
Энэ сургалтын repository-доо terminal нээж, venv идэвхтэй эсэхийг шалгаад:
pip install mypy
mypy --versionmypy 2.3.1 (compiled: yes)Таны хувилбар 2.x-ийн өөр дугаар байж болно. “compiled: yes” нь mypy C хэл рүү хөрвүүлэгдсэн, хурдан хувилбар гэсэн утгатай. Одоо typing_demo.py файл үүсгэж, энэ бүлгийн алдаануудыг нэг дор цуглуулъя. Эхний хэсэг Хичээл 10.1-ээс:
python
from dataclasses import dataclass
from typing import Literal, TypedDict
def total_price(price: int, quantity: int) -> int:
return price * quantity
@dataclass(frozen=True)
class Student:
name: str
score: int
def find_student(students: list[Student], name: str) -> Student | None:
for student in students:
if student.name == name:
return student
return None
EventName = Literal["order_placed", "order_cancelled"]
def subscribe(event_name: EventName) -> None:
print("Бүртгэлээ:", event_name)
class LogRow(TypedDict):
time: str
duration_ms: int
roster = [Student("Бат", 95)]
row: LogRow = {"time": "08:15:40", "duration_ms": 230}
print(total_price("1500", 3))
print(find_student(roster, "Ану").score)
subscribe("order_place")
print(row["duraton_ms"] + 5)Ажиллуулна:
mypy typing_demo.pytyping_demo.py:37: error: Argument 1 to "total_price" has incompatible type "str"; expected "int" [arg-type]
typing_demo.py:38: error: Item "None" of "Student | None" has no attribute "score" [union-attr]
typing_demo.py:39: error: Argument 1 to "subscribe" has incompatible type "Literal['order_place']"; expected "Literal['order_placed', 'order_cancelled']" [arg-type]
typing_demo.py:40: error: TypedDict "LogRow" has no key "duraton_ms" [typeddict-item]
Found 4 errors in 1 file (checked 1 source file)Дөрвөн алдаа, бүгд програм ажиллахаас өмнө олдсон. Python-оор ажиллуулбал эхний мөр утгагүй “150015001500” хэвлэж, хоёр дахь мөр AttributeError-оор унах бөгөөд гурав, дөрөв дэх мөрөнд хэзээ ч хүрэхгүй. mypy дөрвүүланг нэг дор харуулсан.
Trace: mypy-ийн мөрийг задлах
Мөр бүр ижил бүтэцтэй. Эхнийхийг хэсэг хэсгээр нь задалъя:
typing_demo.py:37: Файлын нэр ба мөрийн дугаар. VS Code-ийн terminal-д энэ хэсэг дээр Ctrl товч дарж хулганаар дарвал тэр мөр рүү шууд очно.
error: Ноцтой байдлын түвшин. “error” бол зөрчил. Удахгүй “note” гэсэн түвшинтэй ч танилцана: нэмэлт тайлбар, алдаа биш.
Argument 1 to "total_price" has incompatible type "str"; expected "int" Мессеж өөрөө: “total_price-ийн 1-р argument нийцэхгүй төрөлтэй: str, int хүлээсэн”. Энэ бол Хичээл 10.1-ийн Анхны жишээний алдаа.
[arg-type] Алдааны код: алдааны ангилал. Энэ код хоёр зүйлд хэрэгтэй: mypy-ийн баримт бичгээс тэр ангиллын дэлгэрэнгүй тайлбарыг хайх, мөн Жишээ 4-т харах тусгай тохиолдолд тэр ангиллыг нарийн үл тоох.
Сүүлийн мөр нийт дүн: “1 файлд 4 алдаа олдлоо, 1 эх файл шалгагдсан”.
Одоо үлдсэн гурвыг Монгол хэлээр уншиж засъя.
38-р мөр: “Student | None-ийн None хэсэгт score attribute байхгүй.” mypy find_student-ийн гарын үсгийг хараад, үр дүн None байж болохыг мэдсэн. Код None тохиолдлыг шийдээгүй. Энэ бол Хичээл 10.1-ийн Жишээ 1-ийн урхи, одоо ажиллахаас өмнө баригдсан. Засвар нь is None шалгалт:
python
found = find_student(roster, "Ану")
print(found.score if found is not None else "олдсонгүй")39-р мөр: “subscribe-ийн 1-р argument нийцэхгүй төрөлтэй: Literal[‘order_place’], Literal[‘order_placed’, ‘order_cancelled’] хүлээсэн.” mypy “order_place” string-ийг ердийн str биш, яг тэр утгатай Literal гэж харсан, түүнийг зөвшөөрөгдсөн утгуудтай тулгаад олоогүй. Хичээл 9.4-ийн "сонсогч хэзээ ч дуудагдахгүй" алдаа одоо ажиллахаас өмнө барьцаалагдана. Засвар: subscribe("order_placed").
40-р мөр: “LogRow TypedDict-д duraton_ms түлхүүр байхгүй.” Үсгийн алдаа. Засвар: row["duration_ms"].
Гурвыг засаад дахин ажиллуулна:
typing_demo.py:37: error: Argument 1 to "total_price" has incompatible type "str"; expected "int" [arg-type]
Found 1 error in 1 file (checked 1 source file)37-р мөрийг total_price(1500, 3) болгоход:
Success: no issues found in 1 source file"Амжилттай: 1 эх файлд асуудал олдсонгүй."
Жишээ 1: generic ба protocol алдаанууд
typing_demo.py-ийн төгсгөлд Хичээл 10.2 ба 10.3-ын алдаануудыг нэмье:
python
from collections.abc import Iterable, Iterator
from typing import Protocol
class Stack[T]:
def __init__(self) -> None:
self._items: list[T] = []
def push(self, item: T) -> None:
self._items.append(item)
def pop(self) -> T:
return self._items.pop()
class Drawable(Protocol):
def draw(self) -> list[str]: ...
def render_all(items: Iterable[Drawable]) -> str:
return "\n\n".join("\n".join(item.draw()) for item in items)
class Banner:
def draw(self) -> str:
return "*** ТАНИЛЦУУЛГА ***"
class Circle:
radius: int = 3
numbers: Stack[int] = Stack()
numbers.push("хорь")
render_all([Banner()])
render_all([Circle()])Импортуудыг файлын эхэнд шилжүүлсэн гэж үзье. mypy:
typing_demo.py:73: error: Argument 1 to "push" of "Stack" has incompatible type "str"; expected "int" [arg-type]
typing_demo.py:74: error: List item 0 has incompatible type "Banner"; expected "Drawable" [list-item]
typing_demo.py:74: note: Following member(s) of "Banner" have conflicts:
typing_demo.py:74: note: Expected:
typing_demo.py:74: note: def draw(self) -> list[str]
typing_demo.py:74: note: Got:
typing_demo.py:74: note: def draw(self) -> str
typing_demo.py:75: error: List item 0 has incompatible type "Circle"; expected "Drawable" [list-item]
typing_demo.py:75: note: "Circle" is missing following "Drawable" protocol member:
typing_demo.py:75: note: draw
Found 3 errors in 1 file (checked 1 source file)Мөрийн дугаарууд таны файлд өөр байж болно. Эхний алдаа: “Stack-ийн push-ийн 1-р argument нийцэхгүй төрөлтэй: str, int хүлээсэн.” Хичээл 10.2-ын Trace-ийн шошго mypy уншсан: numbers нь Stack[int], тиймээс энэ овоолгын push-ийн T нь int.
Хоёр дахь алдаа: "Жагсаалтын 0-р элемент нийцэхгүй төрөлтэй: Banner, Drawable хүлээсэн." Дараа нь note мөрүүд: “Banner-ийн дараах гишүүд зөрчилтэй. Хүлээсэн: def draw(self) -> list[str]. Ирсэн: def draw(self) -> str.” Энэ бол Хичээл 10.3-ын Trace-ийн Алхам 6 яг mypy-ийн үгээр: нэр таарсан, гарын үсэг таарахгүй. Note-ууд mypy алдааныхаа шалтгааныг дэлгэрэнгүй тайлбарлах арга. Тэдгээрийг уншихгүй бол алдааг ойлгоход хэцүү.
Гурав дахь алдаа: “Circle-д Drawable протоколын дараах гишүүн дутуу: draw.” Хичээл 10.3-ын Алхам 5. Засварууд нь Banner-ийн draw-ийг return ["*** ТАНИЛЦУУЛГА ***"] болгох, Circle-д draw нэмэх эсвэл түүнийг render_all-д өгөхгүй байх.
Жишээ 2: hint-гүй функц шалгагддаггүй
Одоо mypy-ийн хамгийн гайхмаар анхдагч зан чанар. Шинэ legacy.py файл:
python
def add_vat(price):
return price * 1.1 + "₮"
def report():
return add_vat(1000)mypy legacy.pySuccess: no issues found in 1 source file"Асуудал олдсонгүй." Гэтэл price * 1.1 + "₮" нь тоог string-тэй нэмэх гэж оролдох тул ажиллах үед TypeError гарна. mypy яагаад хараагүй вэ? Анхдагч тохиргоогоор mypy hint-гүй функцийн биеийг шалгадаггүй. Үүний учир нь: mypy-г hint-гүй их хэмжээний хуучин кодтой төсөлд нэвтрүүлэхэд мянга мянган алдаа гаргахгүйн тулд. Та шинэ кодонд hint бичиж, хуучин код аажмаар нэгдэх боломжтой болдог. Энэ нь ухаалаг загвар, гэвч үүнийг мэдэхгүй бол “mypy алдаа олоогүй тул код зөв” гэсэн буруу итгэл төрнө.
Hint-гүй функцийг ч шалгуулах тохиргоо:
mypy --check-untyped-defs legacy.pylegacy.py:2: error: Unsupported operand types for + ("float" and "str") [operator]
Found 1 error in 1 file (checked 1 source file)“+ үйлдэлд дэмжигдэхгүй төрлүүд: float ба str.” Одоо mypy price-ийн төрлийг мэдэхгүй ч price * 1.1 нь float гэдгийг дүгнэж, түүнийг str-тэй нэмэх боломжгүй гэдгийг олсон. Хамгийн хатуу горим бол mypy --strict: тэр hint-гүй функц бүрийг өөрөө алдаа гэж үзэж, олон нэмэлт шалгалт асаана. Шинэ төсөлд strict-ээс эхлэх нь сайн, хуучин төсөлд аажмаар.
Тохиргоог команд бүрт бичихийн оронд pyproject.toml-д нэг удаа бичнэ. Course 4-т ruff-ийн тохиргоо тэнд байсан. mypy-ийнх зэрэгцэн байрлана:
toml
[tool.mypy]
python_version = "3.12"
check_untyped_defs = true
warn_return_any = truepython_version нь mypy-д таны кодын зорилтот Python хувилбарыг хэлнэ: тэр хувилбарт байхгүй боломжийг хэрэглэвэл анхааруулна. check_untyped_defs нь Жишээ 2-ын тохиргоо. warn_return_any нь Any буцаадаг функцийн талаар анхааруулна, Хичээл 10.2-ын “Any бол шалгалтаас зугтах гарц” сургамжийг хамгаалдаг. Одоо ердөө mypy . гэж ажиллуулахад одоогийн хавтсын бүх Python файл эдгээр тохиргоогоор шалгагдана.
Жишээ 3: reveal_type — mypy юу бодож байна вэ
Заримдаа mypy-ийн алдаа ойлгомжгүй байдаг, учир нь бид хувьсагчийн төрлийг mypy-ээс өөрөөр бодож байна. reveal_type() бол mypy-ийн дотоод дүгнэлтийг харах хэрэгсэл:
python
from typing import reveal_type
scores = {"Бат": 95, "Сараа": 88}
best = max(scores, key=scores.get)
reveal_type(scores)
reveal_type(best)
reveal_type(find_student(roster, "Бат"))typing_demo.py:5: note: Revealed type is "dict[str, int]"
typing_demo.py:6: note: Revealed type is "str"
typing_demo.py:7: note: Revealed type is "Student | None"mypy dict-ийн төрлийг утгуудаас нь дүгнэсэн, max-ийн үр дүнг str гэж мэдсэн, учир нь dict-ийг давтахад түлхүүрүүд гардаг. Эдгээр бол Хичээл 10.2-ын Trace-д бидний гараар мөрдсөн дүгнэлтүүд, одоо mypy өөрөө харуулж байна. Python 3.11-ээс хойш reveal_type typing модульд бий, тиймээс програмыг ажиллуулахад ч алдаа гарахгүй: ажиллах үед тэр жинхэнэ төрлийг stderr-д хэвлэнэ. Шалгаж дууссаны дараа reveal_type мөрүүдийг устгах нь зүйтэй.
Жишээ 4: hint хамгийн их үр өгөх үе — дахин бүтэцлэлт
Энэ бүлгийн hint-үүд жижиг жишээнүүдэд алдаа олсон. Гэвч тэдгээрийн жинхэнэ үнэ цэнэ том код өөрчлөгдөх үед гарна. Хичээл 9.4-ийн event-hub төслийг санаарай. Order dataclass-ийн total талбарыг илүү тодорхой нэрээр, amount_total гэж өөрчлөхөөр шийдсэн гэж бодъё:
python
@dataclass(frozen=True)
class Order:
order_id: int
customer: str
items: tuple[tuple[str, int], ...]
amount_total: intTalbar нэрийг өөрчилсөн ч бусад файлуудад хуучин нэр хэрэглэгдсээр байна. Тэдгээрийг хаана байгааг олох хэрэгтэй. Төслийн функцүүдэд hint нэмсэн бол:
mypy .shop.py:28: error: Unexpected keyword argument "total" for "Order" [call-arg]
shop.py:71: error: "Order" has no attribute "total" [attr-defined]
test_events.py:66: error: "Order" has no attribute "total" [attr-defined]
Found 3 errors in 2 files (checked 3 source files)mypy хоёр файлд гурван газрыг олсон: Order үүсгэх газар, тайлангийн log_sale сонсогч, тест. Тестүүд хэсэгчлэн мөн олох байсан: Хичээл 9.4-ийн тестүүд place_order-ийг дуудаж, Order үүсгэх мөрийг ажиллуулна. Гэвч log_sale-ийн тест байгаагүй тул тэр мөр ажиллах үед, жинхэнэ захиалга ирэх үед л унах байсан. mypy бүх кодыг уншдаг, тестээр ажиллуулсан хэсгийг л биш.
Энэ бол hint-ийн үр ашгийн гол зарчим: hint бичих нь өнөөдөр бага зэрэг ажил, өөрчлөлт бүрт их хэмнэлт. Жижиг скрипт, нэг удаагийн туршилтад hint бараг хэрэггүй. Олон файлтай, удаан хугацаанд хөгжих, олон хүн ажилладаг төсөлд hint хамгийн үнэ цэнэтэй, ялангуяа функцийн гарын үсэг, class-ийн талбар, модулиуд хоорондын хил дээр. Энэ сургалтын ерөнхий зөвлөмж: шинэ кодонд гарын үсэг бүрт hint бич, хуучин кодонд өөрчлөх газраасаа эхлэн аажмаар нэм, CI буюу автомат шалгалтад mypy-г ruff ба pytest-ийн хажууд оруул.
Сүүлийн хэрэгсэл: заримдаа mypy буруу байдаг, эсвэл кодын тодорхой мөрийг засах боломжгүй, жишээлбэл hint-гүй гадны сантай ажиллах үед. Тэр мөрийн төгсгөлд # type: ignore[arg-type] гэж бичвэл mypy зөвхөн тэр мөрийн зөвхөн тэр ангиллын алдааг үл тооно. Алдааны кодыг заавал бичих нь сайн дадал: код заагаагүй # type: ignore тэр мөрийн бүх алдааг, ирээдүйн шинэ алдаануудыг ч нууна. Энэ бол Хичээл 6.2-ын "алдааг залгих" урхитай ижил төстэй: аль болох нарийн, аль болох цөөн.
Хүсвэл Хичээл 9.4-ийн event-hub хавтсанд pyproject.toml-ийн mypy тохиргоог нэмж, mypy . ажиллуулаад хэдэн алдаа гарахыг харж болно. Дараа нь events.py-ийн subscribe ба publish-д Хичээл 10.1-ийн EventName ба Хичээл 10.3-ын Handler hint-үүдийг нэмж, shop.py-д санаатайгаар “order_place” гэж бичээд mypy юу хэлэхийг ажиглаарай. Сонирхвол mypy --strict typing_demo.py-г ажиллуулж, strict горим хэдэн нэмэлт зүйлийг шалгаж байгааг, жишээлбэл hint-гүй функц бүрийг тэмдэглэхийг харах нь тохиргоо сонгоход тусална. Мөн Хичээл 6.4-ийн measurekit дээр mypy ажиллуулж, timed-ийн func=None параметрт hint өгөх нь хэр хэцүү болохыг мэдрэх нь decorator-уудын type hint бол тусдаа, нарийн сэдэв гэдгийг харуулна. Эдгээр бүгд санал бөгөөд дараагийн хичээлүүд үүнийг хийсэн гэж үзэхгүй.
‘mypy’ is not recognized as an internal or external command. Windows-ийн “mypy гэдэг дотоод эсвэл гадаад команд танигдсангүй” гэсэн мессеж. macOS ба Linux-д “mypy: command not found”. mypy суугаагүй, эсвэл өөр venv-д суусан, эсвэл venv идэвхгүй үед гарна. Terminal-ийн мөрийн эхэнд venv-ийн нэр харагдаж байгаа эсэхийг шалга. Мөн python -m mypy typing_demo.py гэж Python-оор дамжуулан ажиллуулах нь ихэвчлэн найдвартай: тэр одоогийн venv-ийн mypy-г ашиглана.
error: Library stubs not installed for “requests” [import-untyped]. “requests-ийн stub-ууд суугаагүй байна” гэсэн утгатай. Ихэвчлэн дараагийн мөрөнд “note: Hint: “python3 -m pip install types-requests”” гэсэн зөвлөгөө гарна. Зарим гадны сан hint-гүй бөгөөд тэдгээрийн hint-үүдийг тусдаа “stub” багц болгон түгээдэг. Шийдэл нь зөвлөгөөнд бичсэн багцыг суулгах. Хэрэв stub байхгүй бол “error: Cannot find implementation or library stub for module named ...” гэсэн мессеж гарч болно: тэр модуль огт суугаагүй, эсвэл hint-гүй, stub-гүй. Тэр тохиолдолд импортын мөрөнд # type: ignore[import-not-found] хэрэглэж болно.
Success: no issues found, гэвч код ажиллах үед унах. Мессеж нь алдаа биш, гэвч хамгийн аюултай нөхцөл. Жишээ 2-ын шалтгаан: hint-гүй функцүүд анхдагчаар шалгагддаггүй. Мөн Any төрлийн утга, гаднаас ирэх өгөгдөл mypy-ийн хараанаас гадуур үлддэг. “mypy асуудал олоогүй” гэдэг нь “hint-ийн хүрээнд зөрчил байхгүй” гэсэн утгатай, "код зөв" гэсэн биш. pyproject.toml-д check_untyped_defs-ийг асааж, тестүүд ба ажиллах үеийн шалгалтыг хэвээр хадгал.
error: “Order” has no attribute “total” [attr-defined]. “Order-д total attribute байхгүй” гэсэн утгатай. Жишээ 4-ийн дахин бүтэцлэлтийн үед гарна, гэхдээ энгийн үсгийн алдаанаас ч гарна. Mypy 2.0-оос хойш ийм алдаанд ойролцоо нэрийг санал болгодог тул “Did you mean ...?” гэсэн нэмэлт хэсгийг ч анзаараарай. Ижил санаа “Name “ORDER_PLAC” is not defined [name-defined]” гэсэн алдаанд ч хамаарна.
error: Missing return statement [return]. “return мөр дутуу байна” гэсэн утгатай. Функцийн гарын үсэг -> int гэж хэлдэг ч функцийн зарим зам return-гүйгээр дуусч, далдуур None буцаадаг үед гарна. Жишээлбэл if-elif гинжийн ямар ч салаа таарахгүй тохиолдол. Хичээл 10.2-ын "гарын үсэг ба зан чанар нийцтэй байх" зарчим: бүх замд int буцаах, эсвэл гарын үсгийг -> int | None болгох, эсвэл тохирохгүй тохиолдолд алдаа шидэх.
mypy бол кодыг ажиллуулалгүйгээр type hint-үүдийг хооронд нь тулгадаг static type checker. pip-ээр venv-д суулгаж, mypy файл.py эсвэл mypy . гэж ажиллуулна. Мөр бүр файл:мөр, ноцтой байдал, мессеж, дөрвөлжин хаалтанд алдааны код гэсэн бүтэцтэй. Note мөрүүд алдааны шалтгааныг дэлгэрэнгүй тайлбарладаг тул заавал уншина. Энэ бүлгийн бүх алдаа, нийцэхгүй argument, шалгагдаагүй None, Literal-д үл таарах утга, TypedDict-ийн буруу түлхүүр, generic шошгоны зөрчил, протоколын дутуу эсвэл зөрчилтэй гишүүн, бүгд ажиллахаас өмнө олдсон. Анхдагчаар mypy hint-гүй функцийн биеийг шалгадаггүй: check_untyped_defs = true эсвэл --strict түүнийг асаана. Тохиргоог pyproject.toml-ийн [tool.mypy] хэсэгт бичнэ. reveal_type() mypy-ийн дүгнэлтийг харуулдаг. # type: ignore[код] нь нарийн, цөөн хэрэглэгдэх ёстой. Hint хамгийн их үр өгөх үе бол том кодыг өөрчлөх үе: mypy тестийн хамрагдаагүй газрыг ч олдог. mypy тестийг орлохгүй, тест mypy-г орлохгүй: тэд ruff-тай хамт нэг ажлын урсгалд нөхдөг.
Ингээд Бүлэг 10 дуусч, type hint таны хувьд тайлбар биш, шалгагддаг гэрээ боллоо. Дараагийн бүлэг өөр төрлийн гэрээнд шилжинэ: алдааны гэрээ. Энэ сургалтын туршид бид ValueError, TypeError, KeyError зэрэг бэлэн exception-уудыг шидэж ирсэн. Бодит програмд эдгээр нь хангалттай тодорхой биш: “ValueError” гэдэг нь хэрэглэгчийн буруу оролт уу, тохиргооны алдаа уу, гадны сервисийн хариу уу? Дараагийн хичээлд бид жижиг програмд зориулж өөрийн exception шатлал бүтээж, өөрийн алдаануудыг барих нь бүх алдааг барихаас яагаад илүү гэдгийг шударгаар харуулна.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.