我有 3 个简单的类,例如:
class Animal(abc.ABC):
...
class Cat(Animal):
...
class Dog(Animal):
...
Run Code Online (Sandbox Code Playgroud)
然后我有一个注释如下的函数:
def speak(animals: List[Animal]) -> List[str]:
...
Run Code Online (Sandbox Code Playgroud)
我的问题是我想限制List[Animal]只包含一种动物,所以:
speak([Dog(), Dog()]) # OK
speak([Cat(), Cat()]) # OK
speak([Cat(), Dog()]) # typing error
Run Code Online (Sandbox Code Playgroud)
我将如何注释该speak函数以实现此目的?是否可以使用打字来完成,或者我是否被迫在运行时检查这一点?
我尝试使用上面的方法,但是在调用likeList[Animal]时不会出现错误。speakspeak([Cat(), Dog()])
我也尝试过使用泛型,TypeVar('T', bound=Animal)但这仍然允许我传递子List类的任意组合。