Предупреждение IDE в самодельном декораторе
Есть класс QtPy5 в нём есть методы, пред тем как их выполнить нужно проверить загружен ли пользователь. Декоратор вида:
def is_active_user(func):
"""декоратор для определения активен ли юзер"""
def wrapper(self):
if not self.USER_active:
return self.statusbar.showMessage('Загрузи хоть одного пользователя', 2000)
else:
return func(self)
return wrapper
PyCharm выдаёт предупреждение над func(self) - This inspection highlights attempts to call objects which are not callable, like, for example, tuples.
Когда декорирую метод: @is_active_user - подсвечивается (This inspection reports discrepancies between declared parameters and actual arguments, as well as incorrect arguments (e.g. duplicate named arguments) and incorrect argument order. Decorators are analyzed, too.) и вроде всё работает, но что-то я не понимаю.
Ответы (2 шт):
Автор решения: gil9red
→ Ссылка
Добавьте подсказку типа typing.Callable:
from typing import Callable
def is_active_user(func: Callable):
...
Автор решения: S. Nick
→ Ссылка
Попробуйте так:
import sys
import threading
import functools # +++
from PyQt5.QtCore import QObject, QThread, pyqtSignal
from PyQt5.QtWidgets import QApplication
def is_active_user(func):
"""декоратор для определения активен ли юзер"""
print(f'\nfunc : name={func.__name__}, \n\t module={func.__module__}, \n\t doc={func.__doc__}, \n\t dict={func.__dict__}')
@functools.wraps(func)
def wrapper(self):
if not self.USER_active:
return print('Загрузи хоть одного пользователя', 2000)
else:
print('++++++++++')
return func(self)
print(f'\nwrapper: name={wrapper.__name__}, \n\t module={wrapper.__module__}, \n\t doc={wrapper.__doc__}, \n\t dict={wrapper.__dict__}')
return wrapper
class Worker(QObject):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.USER_active = True # True or False
@is_active_user
def some_function(self):
print(f'some_function is running on thread -> {threading.current_thread().name}')
class Main(QObject):
signal_for_function = pyqtSignal()
def __init__(self):
super().__init__()
print(f'\nThe main thread is -> {threading.current_thread().name}')
self.thread = QThread(self)
self.worker = Worker()
self.worker.moveToThread(self.thread)
self.thread.start()
self.signal_for_function.connect(self.worker.some_function)
app = QApplication(sys.argv)
m = Main()
m.signal_for_function.emit()
QThread.msleep(1000)
m.thread.quit()
m.thread.wait()