Когда я писал этот вопрос, я понял ответ на свою проблему, поэтому я решил, что все равно задам вопрос и отвечу на него, чтобы позже сэкономить людям с подобными вопросами.
Что происходит?
Обратите внимание, что последний пример из документации Mypy:
Callable
- это пример типа, который ведет себя противоречиво в типах аргументов, а именно Callable[[Employee], int]
является подтипом Callable[[Manager], int]
.
Здесь Manager
подклассов из Employee
.То есть, если что-то ожидает функцию, которая может взять на себя менеджеры, все в порядке, если функция, которую она получает, обобщенно и может принимать любого сотрудника, потому что она определенно будет принимать менеджеров.
Однако, в нашем случае, MyObject
подклассы от object
.Таким образом, если что-то ожидает функцию, которая может принимать объекты, то это не хорошо, если функция, которую она получает, переопределяет и может принимать только MyObject
с.
Почему?Представьте себе класс с именем NotMyObject
, который наследуется от object
, но не наследуется от MyObject
.Если функция должна быть в состоянии захватить какой-либо объект, она должна иметь как NotMyObject
s, так и MyObject
s.Однако специфическая функция может принимать только MyObject
с, поэтому она не будет работать в этом случае.
Как это исправить?
Mypy правильно.Вам необходимо иметь более конкретную функцию (MyCallableSubclass
) в качестве типа, иначе либо в вашем коде могут быть ошибки, либо вы печатаете неправильно.