Как написать подсказку общего типа для метода Python для функции декоратора?Python

Программы на Python
Ответить
Anonymous
 Как написать подсказку общего типа для метода Python для функции декоратора?

Сообщение Anonymous »

Я создал декоратор Python, который отлично работает с функциями. Он позволяет вызывать функцию напрямую или выполнять ее из потока. Я хотел бы использовать его и для методов, но это приводит к ошибке, когда mypy проверяет мое использование.
Вот как выглядит декоратор:
from typing import Callable, Generic, TypeVar, ParamSpec
from functools import wraps
from threading import Thread

P = ParamSpec('P')
R = TypeVar('R')

class CallOrThreadFunction(Generic[P, R]):
def __init__(self,
start_thread: Callable[P, Thread],
call: Callable[P, R]):
self.start_thread = start_thread
self.call = call

def call_or_start_thread(function: Callable[P, R]) -> CallOrThreadFunction[P, R]:
@wraps(function)
def start_thread(*args, **kwargs): # pylint: disable=unused-argument
thread = Thread(target=function, args=args, kwargs=kwargs, daemon=True)
thread.start()
return Thread

return CallOrThreadFunction(start_thread, function)

Вот пример его использования в методе:
class Employee:
def __init__(self, name: str):
self.name = name

@call_or_start_thread
def my_method(self, parameter: int = 1):
print(f'name: {self.name} parameter: {parameter}')

adrian = Employee('Adrian')
adrian.my_method.start_thread(5)

MyPy сообщает об ошибке в последней строке:
Аргумент 1 имеет несовместимый тип «int»; ожидаемый "Сотрудник"
Проблема, по-видимому, заключается в том, что, когда к методу применяется декоратор, метод "self" включается в P. Однако когда я вызываю этот метод, self имеет уже объединены в "adrian.my_method".
MyPy не сообщает об ошибке для этой версии
Employee.my_method.start_thread(adrian, 5)

Но я пытаюсь выяснить, можно ли написать подсказки универсального типа таким образом, чтобы они работали со стандартным вызовом метода
adrian.my_method.start_thread(5)


Подробнее здесь: https://stackoverflow.com/questions/783 ... r-function
Ответить

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

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

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

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

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