TypedDict из typing_extensions не работает

from typing_extensions import TypedDict

class Person(TypedDict):
    name: str
    age: int
    is_employee: bool
    
person: Person = {
    "name": "Baber",
    "age": "ten year",  #as i assagin "string" datatype to age instead of "int" but it does not show any error?
    "is_employee": True 
}

print(person['age'])

Я хочу, чтобы эта функция показывала мне ошибку из-за неправильного присвоения целочисленной переменной.

from typing import TypedDict
Jonas Palačionis 14.08.2024 10:13

@JonasPalačionis он также есть в _extensions для более старых версий Python: typing-extensions.readthedocs.io/en/latest/….

jonrsharpe 14.08.2024 10:14

Приятно знать, спасибо.

Jonas Palačionis 14.08.2024 10:14

Когда и где вы ожидаете ошибку? Например, mypy категорически откажется от этого: mypy-play.net/… . Но если вы ожидаете, что сам Python выдаст ошибку во время выполнения, прочтите рамку вверху docs.python.org/3/library/typing.html.

jonrsharpe 14.08.2024 10:14

Связано: например. stackoverflow.com/questions/66665336/… , stackoverflow.com/questions/69555006/….

Andras Deak -- Слава Україні 14.08.2024 11:09
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
5
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если вы хотите отловить ошибки типа, такие как присвоение строки целочисленному полю, вам нужно использовать средство проверки типов, например mypy, потому что Python не будет выдавать ошибки типа во время выполнения на основе подсказок типа. Для проверки статического типа вам понадобятся такие инструменты, как mypy.

сначала установите mypy

pip install mypy

тогда беги

  mypy filename.py

тогда вы начнете видеть такие ошибки

filename.py:8: error: Incompatible types (expression has type "str", TypedDict item "age" has type "int")
Found 1 error in 1 file (checked 1 source file)
Ответ принят как подходящий

Как объяснено в этом ответе, «python не будет выдавать ошибки типа во время выполнения на основе подсказок типа».

mypy можно использовать для статической проверки типа вашей программы. Обратите внимание, что этот подход работает в таком простом примере, но может потерпеть неудачу, если типы не объявлены явно с аннотациями типов.

Например, использование mypy в этой программе пройдет:

from typing_extensions import TypedDict

def return_str():
    return "test"

class Person(TypedDict):
    name: str
    age: int
    is_employee: bool
    
person: Person = {
    "name": "Baber",
    "age": return_str(),
    "is_employee": True 
}

print(person['age'])

Альтернативой решению mypy может быть использование модуля pydantic:

import pydantic

def return_str():
    return "test"

class Person(pydantic.BaseModel):
    name: str
    age: int
    is_employee: bool
    
person = Person.model_validate({
    "name": "Baber",
    "age": return_str(),  # error
    "is_employee": True 
})

print(person.age)

Pydantic выполнит проверки во время выполнения, даже если аннотации типов не указаны, и вернет ошибку вида:

вернуть cls.pydantic_validator.validate_python( pydantic_core._pydantic_core.ValidationError: 1 ошибка проверки для Возраст человека. Ввод должен быть допустимым целым числом, не позволяющим проанализировать строку. как целое число [type=int_parsing, input_value='test', input_type=str]

Обратите внимание, что проверки во время выполнения должны обнаружить ошибку, чтобы сообщить о ней. Следовательно, вам следует соблюдать принцип отказоустойчивости и проверять данные как можно скорее. Это необходимо использовать, когда средства проверки статических типов, например, mypy не могут проверить типы данных, полученных из других файлов или API.

да, это сработало! Спасибо

Baber Raheem Yousafzai 14.08.2024 21:32

Другие вопросы по теме