Использовать общий псевдоним типа

Мои аннотации типов, которые у меня сейчас есть, выглядят примерно так, и я хочу использовать набираю псевдоним, чтобы не повторяться так часто:

У класса есть переменные класса, которые могут быть как определенного типа, так и функции (с параметром), возвращающей этот тот же тип.

class Foo(object):
  state:  ClassVar[Union[str, Callable[[SomeObject], str]]]  # str or func->str
  number: ClassVar[Union[int, Callable[[SomeObject], int]]]  # int or func->int
  foobar: ClassVar[Union[bool, Callable[[SomeObject], bool]]] # bool or func->bool
# end class

Для завершения вот пример реализации:

class FooBar(Foo):
   state = "something"
   number = lambda x: int(x.bla)

   @classmethod
   def foobar(cls, x):
     return x.blabla == cls.state
   # end def
# end class

Однако я не могу понять, как сделать универсальный индекс. Я ищу что-то вроде:

ClassValueOrCallable = lambda T: ClassVar[Union[T, Callable[[SomeObject], T]]]

class Foo(object):
  state:  ClassValueOrCallable(str)
  number: ClassValueOrCallable(int)
  foobar: ClassValueOrCallable(bool)


Изменить:
После раздел псевдонимов общих типов в mypy, похоже, его можно записать как

T = TypeVar('T')  # Any type.
ClassValueOrCallable = ClassVar[Union[T, Callable[[SomeObject], T]]]

class Foo(object):
  state:  ClassValueOrCallable[str]
  number: ClassValueOrCallable[int]
  foobar: ClassValueOrCallable[bool]

Но, по крайней мере, PyCharm этого не распознает и просто отображает тип как Any, поэтому я не уверен, что он правильный. быстрые документы pycharm, показывающие 'Any'


person luckydonald    schedule 26.05.2019    source источник


Ответы (1)


Это должно работать:

from typing import *

T = TypeVar('T')  # Any type.
ValueOrCallable = Union[T, Callable[..., T]]

class Foo(object):
  state:  ClassVar[ValueOrCallable]

person Victor Ruiz    schedule 16.08.2019