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

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Протокол Python, использующий аргументы, содержащие только ключевые слова, требует, чтобы реализация имела другую сигнат

Сообщение Anonymous »

Я использую Python 3.10. Я использую средство проверки типов PyCharm по умолчанию и MyPy.
Вот протокол, который я определил:

Код: Выделить всё

class OnSubscribeFunc(Protocol):
def __call__(self, instrument: str, *, x: int) -> AsyncGenerator:
...
При создании метода, реализующего его следующим образом:

Код: Выделить всё

class A:
async def subscribe(self, instrument: str, *, x: int):
yield ...
a: OnSubscribeFunc = A().subscribe  # this apparently is where it gets it wrong
Я получаю это предупреждение: ожидаемый тип «OnSubscribeFunc», вместо этого получен «(instrument: str, Any, x: int) -> AsyncGenerator»
Однако если я удалю * из своей реализации, предупреждение исчезнет. Я ожидал бы, что все будет наоборот, потому что отсутствие * позволяет реализации иметь аргументы, не состоящие только из ключевых слов, что может быть не тем, к чему я стремлюсь с помощью моего протокола.
Итак, для сравнения: эта реализация не выдает никаких предупреждений:

Код: Выделить всё

class A:
async def subscribe(self, instrument: str, x: int):
yield ...
Для меня это не имеет никакого смысла. Почему он ведет себя так и ожидаемо ли это, или это ошибка в моей проверке типов?


Подробнее здесь: https://stackoverflow.com/questions/791 ... o-have-dif
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»