Как написать подсказку общего типа для метода 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»