Я испытываю ошибку проверки типа с питанием при использовании декоратора с помощью метода, который переопределяет другой метод. Ошибка возникает, когда метод имеет два параметра (я и другой параметр), но исчезает, когда есть только один параметр (self) < /p>
здесь мой код: < /p>
# With Error
from functools import wraps
from typing import Callable, Concatenate, ParamSpec, TypeVar
T = TypeVar("T")
P = ParamSpec("P")
R = TypeVar("R")
def use_channel(
func: Callable[Concatenate[T, str, P], R]
) -> Callable[Concatenate[T, str, P], R]:
@wraps(func)
def wrapper(self: T, channel: str, *args: P.args, **kwargs: P.kwargs) -> R:
print(f"[Decorator] self={self}, channel={channel}")
return func(self, channel, *args, **kwargs)
return wrapper
class A:
def set_channel(self, channel: str):
pass
class B(A):
@use_channel
# It result in Pyright Error
def set_channel(self, channel: str):
pass
< /code>
# No Error
from functools import wraps
from typing import Callable, Concatenate, ParamSpec, TypeVar
T = TypeVar("T")
P = ParamSpec("P")
R = TypeVar("R")
def use_channel(
func: Callable[Concatenate[T, P], R]
) -> Callable[Concatenate[T, P], R]:
@wraps(func)
def wrapper(self: T, *args: P.args, **kwargs: P.kwargs) -> R:
print(f"[Decorator] self={self}")
return func(self, *args, **kwargs)
return wrapper
class A:
def set_channel(self, channel: str):
pass
class B(A):
@use_channel
# No Error
def set_channel(self, channel: str):
pass
< /code>
Сообщение об ошибке: < /p>
Метод "set_channel" переопределения класса "a" в несовместимой манере < /p>
Параметр 2 Mismatch: базовый параметр "канал"-это ключевой параметр, параметр переопределения-это позиционирование. Зачем здесь есть один или два параметра имеют значение здесь? Это связано с тем, как пирайт проверяет совместимость между методами? »
Подробнее здесь: https://stackoverflow.com/questions/796 ... ecorator-w
Почему Pyright сообщает о несовместимого метода переопределяется при использовании декоратора с несколькими параметрами? ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение