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

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

Сообщение Anonymous »

У меня есть класс данных, поле которого может быть константой или функцией, принимающей Self. Есть вспомогательная функция, которая делает правильные вещи: если поле содержит константу, она возвращает константу. Если поле содержит функцию, оно вызывает функцию, используя self:

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

from dataclasses import dataclass
from typing import Self, Callable

@dataclass
class MyClass:
my_func_field: str | Callable[[Self], str]

def my_field(self) -> str:
if isinstance(self.my_func_field, str):
return self.my_func_field
else:
return self.my_func_field(self)
mypy это не нравится (детская площадка):

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

main.py:12: error: Argument 1 has incompatible type "MyClass"; expected "Self"  [arg-type]
Однако, если я упрощу ситуацию, чтобы это был просто вызов, я не столкнусь с этой проблемой:

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

from dataclasses import dataclass
from typing import Self, Callable

@dataclass
class MyClass:
my_func_field: Callable[[Self], str]

def my_field(self) -> str:
return self.my_func_field(self)
Меня это удивляет. Я предположил, что ветка else в первом примере будет проверять тип точно так же, как и во втором примере, потому что в ветке else my_func_field сужено до Callable[[Self] , str], который имеет тот же тип, что и второй пример.
Что мне здесь не хватает? Можно ли заставить mypy принять что-либо, или мне нужно использовать комментарий # ignore?

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

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

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

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

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

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

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