Pythonic способ обернуть функцию, используя дополнительные аргументы и изменяя вывод - PullRequest
1 голос
/ 08 ноября 2019

Я использую функции из внешних библиотек (например, scipy.optimize.minimize ) и для удобства я обернул их для предварительной обработки и последующей обработки аргументов. Мне известно о оболочках декоратора от functools , но я не могу найти способ использовать его должным образом.

Вот базовый пример того, что я делаю:

def wrapper(outer_arg, **inner_arguments):
    inner_arg = prepare_inputs(outer_arg)
    inner_output = inner_function(inner_arg, **inner_arguments)
    outer_output = prepare_outputs(inner_output)
    return outer_output

Проблема в том, что я теряю строку документации из inner_function при вызове help и я не хочу копировать все аргументы в объявлении оболочки. Я попытался добавить декоратор wraps следующим образом:

@wraps(inner_function)
def wrapper(outer_arg, **inner_arguments):
    inner_arg = prepare_inputs(outer_arg)
    inner_output = inner_function(inner_arg, **inner_arguments)
    outer_output = prepare_outputs(inner_output)
    return outer_output

Но затем я теряю строку документации wrapper при вызове help .

Есть ли способ написать эту функцию, которая бы дала пользователю представление как об оболочке , так и о inner_function (и возможность использовать автозаполнение и т. Д. ...) ?

Спасибо

1 Ответ

0 голосов
/ 11 ноября 2019

Используя идею @deceze, я создал декоратор для форматирования доктрины обернутой функции:

def merge_docstrings(other):
    def decorator(func):
        func.__doc__ = f'{func.__doc__}'.format(other.__doc__)
        return func
    return decorator

Он форматирует wrapper доктрину с inner_function Но он не работает, когданапример, отображение строки документации в PyCharm, и, очевидно, вы не получите автозаполнение с аргументами inner_function. Я не уверен, как работает автозаполнение и можно ли добиться того, чего я хочу.

...