Python: деректен өз есебіңізге дейін 54-сабақ (барлығы 56)
Тип аннотациялары және mypy: іске қосуға дейінгі қате
Python курсының елу үшінші сабағы. Дерек пішінін функция сигнатурасында сипаттап, `None` мәнін тексеру арқылы типті тарылтамыз және үйлеспейтін мәндерді бағдарлама орындалмай тұрып `mypy` көмегімен табамыз.
Бұл не үшін керек
Python динамикалық тіл болып қалады: аннотация орындау кезінде санның орнына жол беруге тыйым салмайды. Бірақ редактор мен mypy мәннің жолын алдын ала тексереді. Типтер модуль шекарасында — аргументте, қайтарылатын нәтижеде және жазба құрылымында — ерекше пайдалы.
Бірден толығымен
from dataclasses import dataclass
@dataclass(frozen=True)
class Observation:
source_id: str
year: int
value: float
def latest(rows: list[Observation]) -> Observation | None:
if not rows:
return None
return max(rows, key=lambda row: row.year)
def label(row: Observation | None) -> str:
if row is None:
return "дерек жоқ"
return f"{row.year}: {row.value:.1f} %"
print(label(latest([Observation("cpi-kz", 2025, 11.4)])))
Нәтиже:
2025: 11.4 %
-> Observation | None сигнатурасы бос тізім болуы мүмкін екенін ашық көрсетеді. if row is None тексеруінен кейін анализатор типті тарылтады: төменде row міндетті түрде Observation болады.
mypy тексеруі
Курста бекітілген нұсқаны орнатып, файлды тексеріңіз:
python -m pip install mypy==2.3.1
python -m mypy --strict digest.py
Observation("cpi-kz", "2025", 11.4) деп жазсаңыз, екінші аргумент int болуы керегін анализатор көрсетеді. Python кодты іске қоса алуы мүмкін: статикалық талдау мен орындалу уақытының айырмасы осы.
Бірден барлық кітапхананы емес, өз модульдеріңізді тексеруден бастаңыз. pyproject.toml файлының ықшам баптауы:
[tool.mypy]
python_version = "3.12"
strict = true
files = ["sholu", "main.py"]
Мұндағы нұсқа — автор компьютеріндегі кездейсоқ нұсқа емес, жоба қолдайтын ең төмен Python нұсқасы.
Коллекциялар және түсінікті бүркеншік аттар
SourceID = str
Evidence = dict[SourceID, float]
def missing(required: set[SourceID], known: Evidence) -> set[SourceID]:
return required - known.keys()
Бүркеншік ат ниетті көрсетеді, бірақ SourceID = str жаңа тип жасамайды. Екі жолды шатастыру қауіпті болса, кейін NewType қолдануға болады.
Белгісізді Any ішіне жасырмаңыз
Any мәнге арналған тексеруді өшіріп, ары қарай таралады. JSON жауабы жүйе шекарасында шынымен белгісіз: оны алдымен object ретінде қабылдап, құрылымын тексеріңіз, содан кейін типтелген жазба жасаңыз. Тек тыныштық үшін бүкіл сөздікті dict[str, Any] деп жарияламаңыз.
Аннотация ауқымды, өлшем бірлігін немесе source_id бар-жоғын тексермейді. Бұл — валидация мен тесттердің жұмысы. Типтер 52-сабақты толықтырады, алмастырмайды.
Сабақ картасы
Тірек белгі: шекара → дәл тип → тарылту → mypy → орындалу тесті.
Өз сөзіңізбен айтыңыз
- Неліктен аннотация орындалу кезіндегі тексеру емес?
Observation | Noneнені білдіреді?- Өріске дейін
Noneмәнін неге тексереміз? Anyнеге жүйе шекарасында ғана қалуы керек?
Жаттығу
1. Нәтижені болжаңыз.
def size(values: list[int]) -> int:
return len(values)
print(size([3, 5]))
2. Қайтарылатын типті толтырыңыз.
def title(year: int) ... str:
return f"Есеп {year}"
3. Түзетіңіз. row мәні None болуы мүмкін:
def show(row: Observation | None) -> str:
return str(row.year)
Тапсырма
Міндетті. latest пен label функцияларын типтеңіз. Қалыпты және бос тізімді тексеріңіз. python -m mypy --strict solution.py пәрменін және файлдың өзін іске қосыңыз.
2025: 11.4 %
дерек жоқ
Өз дерегіңізбен. Сводканың үш ашық функциясына тип қосып, қатені # type: ignore қолданбай түзетіңіз.
Қосымша. NewType("SourceID", str) жасап, шатасқан идентификаторды анализатор қайдан табатынын қараңыз.
Бұл жобаның қай жеріне кіреді
28-қадам модель шекарасына типтер мен қатаң mypy баптауын қосады. Келесі сабақ басқа компьютерде дәл сол талдау мен тесттерді қайталау үшін Python мен тәуелділіктерді бекітеді.
Жауаптар
Жауаптарды көрсету
- Python әдетте аннотацияны шектеу ретінде орындамайды; оны анализатор оқиды.
- Функция жазбаны немесе нәтиженің жоқтығын қайтарады.
- Тексеру типті тарылтып, жоқ объектінің өрісіне жүгінуден қорғайды.
Anyпайдалы тексеруді өшіріп, белгісіздікті таратады.
2
->қажет.
def title(year: int) -> str:
return f"Есеп {year}"
print(title(2025))
Есеп 2025
- Алдымен
Noneжағдайын өңдеңіз.
def show(row: Observation | None) -> str:
if row is None:
return "дерек жоқ"
return str(row.year)
Дереккөздер
- Python: typing — стандартты аннотациялар.
- mypy: Getting started — статикалық тексеру.
- mypy: The
Anytype — динамикалық типтеу шекарасы.
Пікірлер (0)
Пікір қалдыру үшін кіріңіз →
Әзірге пікір жоқ. Бірінші болыңыз.