Как заставить универсальные типы прокси работать со статическими контролерами типов - PullRequest
0 голосов
/ 13 мая 2018

Я пишу оболочку ORM, которая позволяет писать определения моделей с аннотациями типов. Теперь я хотел бы добавить универсальные типы Unique[T], Index[T] и Primary[T] для аннотирования типов, имеющих соответствующее ограничение. Однако я хотел бы, чтобы эти типы были прозрачными прокси для T для IDE и других статических контроллеров типов. Так что если у вас есть такой тип:

something: Unique[str]

Типы проверки и IDE будут действовать так, как сказано:

something: str

Текущая реализация:

T = TypeVar('T')
class Unique(Generic[T]):
    def __new__(cls, *args, **kwargs):
        raise TypeError(f'cannot instantiate {cls}')

Есть ли способ превратить его в своего рода прокси-тип?

1 Ответ

0 голосов
/ 14 мая 2018

Насколько мне известно, не существует PEP 484-совместимого способа сделать это.

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

Если, однако, вы хотите применить ограничения «Уникальный», «Индекс» и «Основной» только к фиксированному числу типов, вы можете использовать NewType , например, так:

from typing import NewType

UniqueInt = NewType('UniqueInt', int)
UniqueStr = NewType('UniqueStr', str)
# etc...

Это немного странно, но делает , позволяя создавать отдельные подклассы существующих конкретных типов, что позволяет получить эффект проксирования.

...