Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为实现接口的类键入提示_Python_Python 3.x_Type Hinting - Fatal编程技术网

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
的方式一致。

如果执行静态分析,最安全的选择是在任何地方提供提示。这个问题实际上取决于静态分析器是如何实现的,我不相信任何分析器都会意识到您的类实现了一个抽象方法,因此,使用了这里提供的类型。请参阅,任何关于我的答案错误原因的澄清都是受欢迎的。