Мои аннотации типов в настоящее время выглядят примерно так, и я хочу использовать псевдоним ввода , чтобы не повторяться так часто:
В классе есть переменные класса, которые могутможет быть указанным типом или функцией (с параметром), возвращающей тот же тип.
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
, поэтому я не слишком уверен, правильно ли это.