在尝试将我的代码更新为符合PEP-484时(我使用的是mypy 0.610),我遇到了以下报告:
$ mypy mymodule --strict-optional --ignore-missing-imports --disallow-untyped-calls --python-version 3.6myfile.py:154: error: Signature of "deliver" incompatible with supertype "MyClass"
我的课:

from abc import abstractmethod

from typing import Any


class MyClass(object):

@abstractmethod
def deliver(self, *args: Any, **kwargs: Any) -> bool:
    raise NotImplementedError

myfile.py:
class MyImplementation(MyClass):

[...]

    def deliver(self, source_path: str,
                dest_branches: list,
                commit_msg: str = None,
                exclude_files: list = None) -> bool:

        [...]

        return True

我肯定在这里做错了,但是我不太明白:)

任何指针将不胜感激。

最佳答案

@abstractmethod
def deliver(self, *args: Any, **kwargs: Any) -> bool:
    raise NotImplementedError

这个声明并不意味着子类可以给deliver他们想要的任何签名。子类deliver方法必须准备好接受父类(super class)deliver方法将接受的任何参数,因此您的子类deliver必须准备好接受任意位置或关键字参数:
# omitting annotations
def deliver(self, *args, **kwargs):
    ...

您的子类的deliver没有该签名。

如果所有子类都应该具有与deliver相同的MyImplementation签名,那么您也应该给MyClass.deliver相同的签名。如果您的子类将具有不同的deliver签名,则此方法可能实际上不应该在父类(super class)中,或者您可能需要重新考虑您的类层次结构,或为它们提供相同的签名。

10-02 09:33