【问题标题】:Use generic in type alias在类型别名中使用泛型
【发布时间】:2019-05-26 21:14:59
【问题描述】:

我目前拥有的类型注释类似于以下内容,并且我想使用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,所以我不太确定它是否正确。

【问题讨论】:

标签: python python-3.x generics typing


【解决方案1】:

这应该可行:

from typing import *

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    相关资源
    最近更新 更多