Я исправил код, чтобы он был корректным для MyPy (это проще проверить с помощью Pytype, который сначала добавляет файлы аннотаций * .pyi).
Проблема с печатью заключалась в методе __iter__()
, что атрибут _choices
кажется неопределенным для проверки, потому что он был назначен не прозрачно, только attrs['_choices'] = ...
.
Это можно аннотировать, добавив одну строку:
class MetaChoices(type):
_choices = None # type: dict # written as comment for Python >= 3.5
# _choices: dict # this line can be uncommented if Python >= 3.6
Это совершенно верно для Pytype и его аннотации, конечно же, проверяются как действительные и для MyPY.
Может быть, эта проблема типизации в __iter__()
может привести к тому, что метод метакласса будет проигнорирован в контролере.
Если исправление не помогло, о проблеме можно сообщить на следующем упрощенном примере:
class MetaChoices(type):
_choices = {0: 'a'}
def __iter__(cls):
return iter(cls._choices.items())
class Choices(metaclass=MetaChoices):
pass
assert list(Choices) == [(0, 'a')]
Я сообщил об еще одной незначительной ошибке в исходной статье.Эта ошибка не связана с этой проблемой.