Разница немного тонкая. Поэтому я объясню, что каждый из них делает
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
Проблема здесь заключается в том, что функция имеет другое поведение и тип, но одно и то же имя, что вводит в заблуждение.