Python 为实现接口的类键入提示
假设我有一个带有单个函数的接口Python 为实现接口的类键入提示,python,python-3.x,type-hinting,Python,Python 3.x,Type Hinting,假设我有一个带有单个函数的接口A class A(metaclass=ABCMeta): @abstractmethod def spam(self, x: int) -> str: pass 有实现此接口的类B和C,但它们不会直接初始化。我将有一些工厂方法(比如说),它将返回给我一个实现a的合适对象。因此,在这种情况下,当我在B和C中实现spam时,我应该重复类型提示吗?实际上,由于没有直接使用B和C,因此A的类型提示似乎就足够了。但我对这种情况下的最
A
class A(metaclass=ABCMeta):
@abstractmethod
def spam(self, x: int) -> str:
pass
有实现此接口的类
B
和C
,但它们不会直接初始化。我将有一些工厂方法(比如说),它将返回给我一个实现a
的合适对象。因此,在这种情况下,当我在B
和C
中实现spam
时,我应该重复类型提示吗?实际上,由于没有直接使用B
和C
,因此A
的类型提示似乎就足够了。但我对这种情况下的最佳实践感到好奇;如果还有其他问题需要考虑。假设,既然您实现了B.spam
,那么它就不会是一个微不足道的实现(否则,为什么要麻烦重写a.spam
?)。因此,您可能应该键入检查B.spam
的正文。在这种情况下,您需要为B.spam
的参数和返回值提供类型提示;否则,mypy将把这些类型视为Any
请注意,如果您确实提供了类型提示,mypy将使用its检查
B.spam
的类型是否与A.spam
兼容,但前提是B
非虚拟地派生自A
;如果您只是A.register(B)
,mypy将完全忽略继承关系。这与运行时不会在虚拟基类中查找.spam
的方式一致。如果执行静态分析,最安全的选择是在任何地方提供提示。这个问题实际上取决于静态分析器是如何实现的,我不相信任何分析器都会意识到您的类实现了一个抽象方法,因此,使用了这里提供的类型。请参阅,任何关于我的答案错误原因的澄清都是受欢迎的。