Как утверждать типы в классах данных python3?

Я использую новую функцию dataclass из Python3, которая позволяет указывать тип полей класса. В этом примере field2 должен иметь тип List[int], и я передал ему List[str]. Этот код работает без сбоев, мне интересно, есть ли (автоматический) способ сбоя кода (т.е. использование утверждений и т. д.), если классу передается неправильный тип.

from dataclasses import *
import typing
@dataclass
class C:
    field1: str
    field2: typing.List[int]

if __name__ == '__main__':
    x = C('a',['a','b'])
    print(repr(x))

person motam79    schedule 28.10.2018    source источник
comment
Для этой цели я создал крошечную библиотеку Python: github.com/tamuhey/dataclass_utils Эту библиотеку можно применить для такого класса данных, который содержит другой класс данных (вложенный класс данных) и тип вложенного контейнера (например, Tuple[List[Dict...)   -  person Yohei    schedule 08.02.2021


Ответы (1)


Классы данных используют подсказки типов, которые не проверено во время выполнения. Их можно проверить с помощью инструментов статического анализа типов, таких как mypy.

Классы данных не предназначены для предоставления полей с проверкой типа во время выполнения. Вы просто определяете поля для сгенерированного класса, а синтаксис подсказок типов упрощает это и также предоставляет подсказки типов.

Если вы используете только подсказки типов и не используете инструмент проверки типов, такой как mypy, вы, по крайней мере, задокументировали ожидаемые типы. Кроме того, некоторые IDE Python, такие как PyCharm и WingIDE, могут предоставлять более интеллектуальные подсказки автозаполнения с этой информацией.

Я бы не стал применять подсказку типа во время выполнения, хотя технически вы можете реализовать такую ​​​​функциональность. Вы действительно не хотите проверять каждый элемент в списке, чтобы увидеть, не являются ли какие-либо из них целыми числами. Это просто пустая трата процессорного времени, когда вы действительно просто хотите написать код, который в первую очередь не создает такой недопустимый список. Статическая проверка типов направлена ​​на то, чтобы дать вам последнее без затрат времени выполнения.

person Martijn Pieters    schedule 28.10.2018