python - 在类型别名中使用泛型

标签 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'

最佳答案

这应该有效:

from typing import *

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

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

关于python - 在类型别名中使用泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56317409/

相关文章:

python - Flask、Nginx、Gunicorn - 包导入导致 502 Bad Gateway(这是环境变量)

Django Rest Framework check_object_permissions 没有被调用

python-3.x - 如何在Python中检查线程是否结束

python - 如何检查一行中的所有列是否都是正数?

java - Java 泛型中的错误 - 所需类型 : List<MyClass> Provided: List<T>

java - 为什么这个复杂的泛型示例不能用 Java 7 编译(但可以用 Java 8),我该如何解决它?

python - 如何绘制优化的进度?

python - 重用 Flask 蓝图 : extend or rewrite?

python - 按不同条件查找邮件 IMAP.search()

java - 如何获取简单的泛型类型名称?