【发布时间】:2018-08-24 03:13:23
【问题描述】:
考虑这段代码
from abc import ABCMeta, abstractmethod
class C():
@abstractmethod
def my_abstract_method(self):
print('foo')
class D(C):
pass
x = C()
y = D()
mypy 不允许 x 和 y 给我一个
test.py:13: error: Cannot instantiate abstract class 'C' with abstract attribute 'my_abstract_method'
test.py:15: error: Cannot instantiate abstract class 'D' with abstract attribute 'my_abstract_method'
我正在使用 mypy 0.570 和 python 3.6.3 进行测试
但是,文档说我需要设置 metaclass=ABCMeta 才能工作。我错过了什么?
【问题讨论】:
-
哪个 Python 版本?我无法在 2.7.x 和 3.4.3 上重现此行为
-
更新问题。我收到了 mypy 版本
0.570的错误。顺便说一句,无论我是否应用metaclass=ABCMeta,我都不会直接收到 python 错误。所以mypy是唯一能真正帮助我发现这个错误的工具。 -
mypy和python做了两件非常不同的事情。mypy是一个静态 分析器,如果您的代码的源 中存在@abstractmethod,则可以随意假设您忘记使用ABCMeta。python只是解释代码,没有ABCMeta,它没有理由对@abstractmethod填充的方法列表做任何事情。 (事实上,在 runtime 方法本身并没有证据表明它被 修饰过。) -
@chepner 是的,这是真的。碰巧我注意到
mypy在没有设置metaclass的情况下捕获了错误,并且我没有进一步检查python的实际作用。我只是停在那里想知道为什么mypy在我认为不应该出现错误时会捕获错误。感谢您提供背景信息!