Shanraq.org Shanraq.org
Тип аннотациялары және mypy: іске қосуға дейінгі қате
IT

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 → орындалу тесті.

Өз сөзіңізбен айтыңыз

  1. Неліктен аннотация орындалу кезіндегі тексеру емес?
  2. Observation | None нені білдіреді?
  3. Өріске дейін None мәнін неге тексереміз?
  4. 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 мен тәуелділіктерді бекітеді.

Жауаптар

Жауаптарды көрсету
  1. Python әдетте аннотацияны шектеу ретінде орындамайды; оны анализатор оқиды.
  2. Функция жазбаны немесе нәтиженің жоқтығын қайтарады.
  3. Тексеру типті тарылтып, жоқ объектінің өрісіне жүгінуден қорғайды.
  4. Any пайдалы тексеруді өшіріп, белгісіздікті таратады.
2
  1. -> қажет.
def title(year: int) -> str:
    return f"Есеп {year}"

print(title(2025))
Есеп 2025
  1. Алдымен None жағдайын өңдеңіз.
def show(row: Observation | None) -> str:
    if row is None:
        return "дерек жоқ"
    return str(row.year)

Дереккөздер

Мәтінде қате не теру қатесі кездессе, бізге айтыңыз

Тапсырманы тексеру

Алдымен VS Code-та шешіп, іске қосыңыз — редактор қатені сол жерде көрсетеді. Дайын шешімді осында қойыңыз. Тексеретін — модель: ол қатені атап көрсетеді, бірақ дайын жауапты бермейді.

Тексеру үшін кіру керек. Кіру

Пікірлер (0)

Әзірге пікір жоқ. Бірінші болыңыз.