Код: Выделить всё
self
Код: Выделить всё
self
здесь мой код с ошибками:
from functools import wraps
from typing import Callable, Concatenate, ParamSpec, TypeVar
T = TypeVar("T")
P = ParamSpec("P")
R = TypeVar("R")
# Here wrapper has channel: str
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>
Этот код не отображает ошибки: < /p>
from functools import wraps
from typing import Callable, Concatenate, ParamSpec, TypeVar
T = TypeVar("T")
P = ParamSpec("P")
R = TypeVar("R")
# Here wrapper only has self argument
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