PyCharm:为什么在这种情况下签名不匹配?

Hoe*_*eze 3 python pycharm python-3.x

考虑以下代码示例:

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
Run Code Online (Sandbox Code Playgroud)

为什么 PyCharm 告诉我ChildExtractor.extract()不匹配BaseExtractor.extract()

我开始认为我只是犯了一些非常愚蠢的错误......

编辑:

class ChildExtractor(BaseExtractor):

    def extract(self, interval, variants, anchor, *args, fixed_len=True, **kwargs):
        pass
Run Code Online (Sandbox Code Playgroud)

这会导致相同的错误。

use*_*698 6

考虑以下用法BaseExtractor

def extractor_usage(extractor: BaseExtractor):
    extractor.extract(interval=10)
Run Code Online (Sandbox Code Playgroud)

它正确使用BaseExtractor接口,但传递ChildExtractor给此方法会导致TypeError.

variants该问题可以通过 make和可选来解决anchor,例如:

class ChildExtractor(BaseExtractor):

    def extract(self, interval, variants=None, anchor=None, *args, fixed_len=True, **kwargs):
        pass

extractor_usage(ChildExtractor())  # No TypeError here
Run Code Online (Sandbox Code Playgroud)

  • 换句话说,子类方法不允许有额外的必需参数(任何额外的参数必须是可选的或有默认值)。 (2认同)