在尝试将我的代码更新为符合PEP-484时(我使用的是mypy
0.610),我遇到了以下报告:$ mypy mymodule --strict-optional --ignore-missing-imports --disallow-untyped-calls --python-version 3.6
myfile.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)中,或者您可能需要重新考虑您的类层次结构,或为它们提供相同的签名。