Mypy允许我们编写class stubs,它可以放在与实际类相同的目录中。这个存根非常类似于其他语言中已知的接口。有没有可能让客户机使用存根而实现严格遵循存根?在
我想工作的例子:
class IDependency:
def do_something(self) -> None: ...
def do_something_else(self) -> None: ...
class Service:
def __init__(self, dependency: IDependency):
dependency.do_something()
dependency.do_something_else() # this fails silently
class DependencyImplementation(IDependency):
def do_something(self) -> None:
print("doing something")
# Note there is no `do_something_else` here.
这很管用。但是,如果DependencyImplementation
没有实现do_something
方法,Mypy和Python本身都没有错误。电话根本没用。我是否必须编写raise NotImplementedException()
或用@abc.abstractmethod
为每个方法添加注释?在Mypy解释器中有一些特殊的标志吗?在
这是Mypy Protocols的用例吗?它似乎很快就要发布了(也许是python4?)在
这确实可以使用
@abc.abstractmethod
或协议来完成。前者类似于使用Java的抽象类;后者则类似于使用Go的接口或Rust特性。在下面是一个使用ABCs的示例:
关于这个例子,有几点需要注意:
foo
。在abc
元类添加到Parent(例如class Parent(metaclass=ABCMeta)
):mypy可以理解@abc.abstractmethod
有没有它意味着什么。只有当您希望Python解释器也强制您在运行时正确地重写了任何标记为抽象的内容时,才包含元类。在您也可以使用协议,不过现在您需要先
^{pr2}$pip install typing_extensions
才能使用它。下面是一个例子:一些注意事项:
Child
故意不从CanFoo
继承:在类和它实现的协议之间没有显式的链接:协议非常类似于Go风格的接口,并且可以更特别。与Java等语言相比,Java确实需要在类定义中包含“implements Blah”。在Child
的实例化上没有得到错误:它本身没有任何错误。相反,当我们试图不恰当地使用它时,我们会得到一个例外。在最后几点提示:
相关问题 更多 >
编程相关推荐