Типизация Python: псевдонимы и лучшие практики NewType?Python

Программы на Python
Anonymous
Типизация Python: псевдонимы и лучшие практики NewType?

Сообщение Anonymous »

Я хочу определить свой собственный тип T для MutableMapping[str, str]. AFAIK, это можно сделать с помощью псевдонимов типов или через NewType

Код: Выделить всё

from typing import MutableMapping, NewType

T_alias = MutableMapping[str, str]
T_new = NewType("T_new", MutableMapping[str, str])
Проблема заключается в необходимом синтаксисе для инициализации одной переменной каждого типа. Правильная инициализация (которая не вызывает ошибок в Pylance/Pyright):

Код: Выделить всё

vn: T_new
va: T_alias

vn = T_new({})
va = {}
Назначение vn мне кажется приемлемым (хотя мне немного неловко передавать пустой текст {). Однако мне не нравится присвоение va, потому что из него не ясно, что va имеет тип T_alias.
Я попробовал:< /p>

Код: Выделить всё

va = T_alias({})
но это не работает(

Код: Выделить всё

Expected no arguments to "MutableMapping" constructor). Поэтому я тоже попробовал:
va = T_alias()
но и это не сработало. Хотя Pylance не вызывает никаких ошибок (которые можно считать ошибкой Pylance?), во время выполнения происходит исключение: TypeError: невозможно создать экземпляр абстрактного класса MutableMapping с помощью абстрактных методов __delitem__, __getitem__, __iter__, __len__, __setitem__< /p>
Поэтому единственный способ инициализировать va, указав, что он имеет тип T_alias, — это использовать typing.cast:

Код: Выделить всё

va = cast(T_alias, {})
что мне тоже кажется неудобным.
Итак, вопрос: правильно ли я понимаю использование псевдонимов типов и NewType? И еще, какой из них можно посоветовать в данном конкретном случае? Я считаю, что инициализация объектов T_new чище (мне не нравится cast()), но меня беспокоит, что NewType() приведет к некоторым накладным расходам при работе с этими объекты, и мне на самом деле не нужно передавать dict, поэтому я бы предпочел использовать псевдоним.

Подробнее здесь: https://stackoverflow.com/questions/694 ... -practices

Вернуться в «Python»