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'])
Я хочу, чтобы эта функция показывала мне ошибку из-за неправильного присвоения целочисленной переменной.
@JonasPalačionis он также есть в _extensions
для более старых версий Python: typing-extensions.readthedocs.io/en/latest/….
Приятно знать, спасибо.
Когда и где вы ожидаете ошибку? Например, mypy категорически откажется от этого: mypy-play.net/… . Но если вы ожидаете, что сам Python выдаст ошибку во время выполнения, прочтите рамку вверху docs.python.org/3/library/typing.html.
Связано: например. stackoverflow.com/questions/66665336/… , stackoverflow.com/questions/69555006/….
Если вы хотите отловить ошибки типа, такие как присвоение строки целочисленному полю, вам нужно использовать средство проверки типов, например 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.
да, это сработало! Спасибо
from typing import TypedDict