Я создал декоратор 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
Как написать подсказку общего типа для метода Python для функции декоратора? ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение