python - PyCharm:为什么在这种情况下签名不匹配?
问题描述
考虑以下代码示例:
class BaseExtractor(object, metaclass=abc.ABCMeta):
@abc.abstractmethod
def extract(self, interval, *args, **kwargs):
raise NotImplementedError
class ChildExtractor(BaseExtractor):
def extract(self, interval, variants, anchor, fixed_len=True, **kwargs):
pass
为什么 PyCharm 告诉我ChildExtractor.extract()
不匹配BaseExtractor.extract()
?
我开始认为我只是犯了一些非常愚蠢的错误......
编辑:
class ChildExtractor(BaseExtractor):
def extract(self, interval, variants, anchor, *args, fixed_len=True, **kwargs):
pass
这会导致相同的错误。
解决方案
考虑以下用法BaseExtractor
:
def extractor_usage(extractor: BaseExtractor):
extractor.extract(interval=10)
它正确使用BaseExtractor
接口,但传递ChildExtractor
给此方法会导致TypeError
.
这个问题可以通过 makevariants
和anchor
optional 来解决,例如:
class ChildExtractor(BaseExtractor):
def extract(self, interval, variants=None, anchor=None, *args, fixed_len=True, **kwargs):
pass
extractor_usage(ChildExtractor()) # No TypeError here
推荐阅读
- ruby-on-rails - rails db:create 成功,但随后给出错误
- python - Django——关系“”不存在
- javascript - 有没有办法停止覆盖对象值?
- android - 仅当本地缓存数据超过 5 分钟或根本不存在时,才使改造从服务器获取新数据
- javascript - 迭代嵌套的 json 对象并在其中操作数据
- python-3.x - Django ORM 查询集
- python - Numpy没有以科学计数法精确打印数组
- oauth - Power BI:提供的凭据不能用于源
- mysql - MySQL WHERE 查询问题(1241:操作数应包含 1 列)
- javascript - 如何使用亚马逊 ses 发送 css 和网格