Рассмотрим этот код
from abc import ABCMeta, abstractmethod
class C():
@abstractmethod
def my_abstract_method(self):
print('foo')
class D(C):
pass
x = C()
y = D()
Ни x
, ни y
не разрешены mypy, что дает мне
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
. Что мне не хватает?
0.570
. Кстати, я не получаю ошибок python напрямую, независимо от того, применяю ли яmetaclass=ABCMeta
или нет. Так чтоmypy
— единственный инструмент, который действительно помогает мне поймать эту ошибку. - person Christoph   schedule 15.03.2018mypy
иpython
делают две совершенно разные вещи.mypy
— это статический анализатор, и он может сделать предположение, что вы забыли использоватьABCMeta
, если@abstractmethod
присутствует в исходном коде вашего кода.python
просто интерпретирует код, и безABCMeta
у него нет причин что-либо делать со списком методов, заполненным@abstractmethod
. (Действительно, во время выполнения в самом методе нет признаков того, что он был декорирован.) - person chepner   schedule 15.03.2018mypy
перехватывает ошибку без установленногоmetaclass
, и я больше не проверял, что на самом деле делаетpython
. Я просто остановился, задаваясь вопросом, почемуmypy
перехватывает ошибку, хотя я думал, что этого не должно быть. Спасибо за справочную информацию! - person Christoph   schedule 16.03.2018