Переменные аргументы с mypy: сигнатура метода несовместима с супертипом - PullRequest
0 голосов
/ 09 марта 2019

Я не совсем уверен, почему mypy возвращает здесь ошибку Signature of "foo" is incompatible with supertype "Base".Типы возвращаемых данных и типы аргументов, кажется, совпадают.

from typing import NoReturn, Union


class Base():
    def foo(self, *args: str) -> Union[NoReturn, str]:
        raise NotImplementedError


class A(Base):
    def foo(self, x: str) -> str:
        return x

Любая помощь очень ценится, спасибо!

РЕДАКТИРОВАТЬ Я изменил A.foo наthis:

def foo(self, *args: str) -> str:
    x = args[0]
    return x

Теперь ошибка mypy исчезла.Однако в этой реализации такая же проблема не возникнет, если при наличии NoReturn в Base переопределенная функция может вернуть только str?

1 Ответ

0 голосов
/ 09 марта 2019

Разница немного тонкая. Поэтому я объясню, что каждый из них делает

def foo(self, *args: str) -> Union[NoReturn, str]:

foo - это метод экземпляра класса Base, который принимает переменное количество строковых аргументов и возвращает либо NoReturn, либо str.

def foo(self, x: str) -> str:

foo - это метод экземпляра класса A, который переопределяет определение foo в классе Base. Он принимает один аргумент str и возвращает один str

Это означает, что я могу назвать Base версию, например, foo('bar', 'baz'), но тот же вызов в A выдаст ошибку.

Точно так же я не могу получить возврат в Base, в то время как вызов переопределенной функции возвращает только str

Проблема здесь заключается в том, что функция имеет другое поведение и тип, но одно и то же имя, что вводит в заблуждение.

...