Декоратор для декораторов, который позволяет видеть параметры задекорированной функции при ее использовании в PyCharm.
PyPi: https://pypi.org/project/decohints/
Ниже показан пример декоратора с параметрами, без использования decohints
:
from functools import wraps
def decorator_with_params(aa=None, bb=None, cc=None):
def _decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
try:
result = func(*args, **kwargs)
except Exception:
print("Error")
return
return result
return wrapper
return _decorator
@decorator_with_params()
def test(a: int, b: int) -> int:
return a + b
Если ввести ниже test()
в PyCharm и подождать, то он подскажет параметры обертки в декораторе как параметры
функции test
:
Это не удобно и может запутать разработчиков, поэтому была сделана эта библиотека.
pip install decohints
✅ Работает со всеми видами декораторов
⚠️ Если ваш декоратор уже обернут в другой декоратор, тоdecohints
должен быть верхним
Чтобы воспользоваться, нужно выполнить два простых шага:
- Импортировать декоратор
decohints
из библиотекиdecohints
:
from decohints import decohints
- Обернуть свой декоратор декоратором
decohints
:
@decohints
def your_decorator():
...
Ниже показан пример декоратора с параметрами, с использованием decohints
:
from functools import wraps
from decohints import decohints
@decohints
def decorator_with_params(aa=None, bb=None, cc=None):
def _decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
try:
result = func(*args, **kwargs)
except Exception:
print("Error")
return
return result
return wrapper
return _decorator
@decorator_with_params()
def test(a: int, b: int) -> int:
return a + b
Если ввести ниже test()
в PyCharm и подождать, то он подскажет параметры функции test
:
❕Примеры использования с классами-декораторами, декораторами классов и другие находятся тут: click
✅ Работает со всеми видами функций-декораторов
Если указать тип wrapper: func
, то будет такое же поведение, как с использованием decohints
.
Пример:
from functools import wraps
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
try:
result = func(*args, **kwargs)
except Exception:
print("Error")
return
return result
wrapper: func
return wrapper
@decorator
def test(a: int, b: int) -> int:
return a + b
Если ввести ниже test()
в PyCharm и подождать, то он подскажет параметры функции test
:
❗️Данный способ работает только в функциях-декораторах с параметрами
Если указать тип Callable
из модуля typing
для результата декоратора с параметрами, то будет такое же поведение, как
с использованием decohints
.
Пример:
from functools import wraps
from typing import Callable
def decorator_with_params(aa=None, bb=None, cc=None) -> Callable:
def _decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
try:
result = func(*args, **kwargs)
except Exception:
print("Error")
return
return result
return wrapper
return _decorator
@decorator_with_params()
def test(a: int, b: int) -> int:
return a + b
Если ввести ниже test()
в PyCharm и подождать, то он подскажет параметры функции test
: