Я создал декоратор 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
Программы на Python
1735615017
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)
Подробнее здесь: [url]https://stackoverflow.com/questions/78381807/how-do-i-write-a-generic-type-hint-for-a-python-method-for-a-decorator-function[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия