在别名类型中使用通用类型

时间:2019-05-26 21:15:00

标签: python python-3.x generics typing

我目前的类型注释与以下内容相似,并且我想使用typing alias来避免重复太多:

类具有类变量,该类变量可以是某些指定的类型,也可以是返回该相同类型的函数(带有参数)。

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's generic type aliases section之后,似乎应该可以将其写为

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 quick-docs showing 'Any'

1 个答案:

答案 0 :(得分:0)

这应该有效:

from typing import *

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

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