Skip to content

Latest commit

 

History

History
201 lines (137 loc) · 6.32 KB

README.ru.md

File metadata and controls

201 lines (137 loc) · 6.32 KB

decohints

PyPI PyPI PyPI

decohints

🇺🇸 English version

Декоратор для декораторов, который позволяет видеть параметры задекорированной функции при ее использовании в 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:

test() (*args, **kwargs)

Это не удобно и может запутать разработчиков, поэтому была сделана эта библиотека.

Установка

pip install decohints

Использование

✅ Работает со всеми видами декораторов
⚠️ Если ваш декоратор уже обернут в другой декоратор, то decohints должен быть верхним

Чтобы воспользоваться, нужно выполнить два простых шага:

  1. Импортировать декоратор decohints из библиотеки decohints:
from decohints import decohints
  1. Обернуть свой декоратор декоратором 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:

test() (a: int, b: int)

❕Примеры использования с классами-декораторами, декораторами классов и другие находятся тут: click

Альтернативные решения

Указание типа wrapper

✅ Работает со всеми видами функций-декораторов

Если указать тип 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:

test() (a: int, b: int)

Указание выходного типа в декораторе с параметрами

❗️Данный способ работает только в функциях-декораторах с параметрами

Если указать тип 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:

test() (a: int, b: int)