Python 如何为所有子类的并集定义类型提示
Python how to define type hint for union of all subclasses
假设我有一个 class 在 recursive/tree 层次结构中有多个子 class:
class Animal:
pass
class Cat(Animal):
pass
class HouseCat(Cat):
pass
我有一个函数,可以根据某些条件创建这些 classes 的实例:
from typing import Union
def creator(condition) -> Union[Animal, Cat, HouseCat]:
# for codition1
return Animal()
# for codition2
return Cat()
# ...etc...
我的问题是 PyCharm 显示了这样的警告,如果我只使用 -> Animal:
作为 return 值注释:
my_list: List[Cat] = []
obj = creator(...)
my_list.append(obj) # <-- Expected type 'Cat' (matched generic type '_T'), got 'Animal' instead
有没有办法定义类型提示,而不是为所有子class 手动编写 Union
?
您可以使用 TypeVar
构造来编写带边界的代码:
from typing import TypeVar, List
class Animal:
pass
class Cat(Animal):
pass
class HouseCat(Cat):
pass
A = TypeVar('A', bound=Animal)
def creator() -> A:
pass
my_list: List[Cat] = []
obj = creator()
my_list.append(obj)
https://docs.python.org/3/library/typing.html#typing.TypeVar
假设我有一个 class 在 recursive/tree 层次结构中有多个子 class:
class Animal:
pass
class Cat(Animal):
pass
class HouseCat(Cat):
pass
我有一个函数,可以根据某些条件创建这些 classes 的实例:
from typing import Union
def creator(condition) -> Union[Animal, Cat, HouseCat]:
# for codition1
return Animal()
# for codition2
return Cat()
# ...etc...
我的问题是 PyCharm 显示了这样的警告,如果我只使用 -> Animal:
作为 return 值注释:
my_list: List[Cat] = []
obj = creator(...)
my_list.append(obj) # <-- Expected type 'Cat' (matched generic type '_T'), got 'Animal' instead
有没有办法定义类型提示,而不是为所有子class 手动编写 Union
?
您可以使用 TypeVar
构造来编写带边界的代码:
from typing import TypeVar, List
class Animal:
pass
class Cat(Animal):
pass
class HouseCat(Cat):
pass
A = TypeVar('A', bound=Animal)
def creator() -> A:
pass
my_list: List[Cat] = []
obj = creator()
my_list.append(obj)
https://docs.python.org/3/library/typing.html#typing.TypeVar