Сохранение подписей украшенных функций

102
задан Fermi paradox 24 January 2016 в 11:59
поделиться

3 ответа

  1. Установка декоратор модуль:

    $ pip install decorator
    
  2. Адаптируют определение args_as_ints():

    import decorator
    
    @decorator.decorator
    def args_as_ints(f, *args, **kwargs):
        args = [int(x) for x in args]
        kwargs = dict((k, int(v)) for k, v in kwargs.items())
        return f(*args, **kwargs)
    
    @args_as_ints
    def funny_function(x, y, z=3):
        """Computes x*y + 2*z"""
        return x*y + 2*z
    
    print funny_function("3", 4.0, z="5")
    # 22
    help(funny_function)
    # Help on function funny_function in module __main__:
    # 
    # funny_function(x, y, z=3)
    #     Computes x*y + 2*z
    
<час>

Python 3.4 +

functools.wraps() от stdlib сохраняет подписи начиная с Python 3.4:

import functools


def args_as_ints(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        args = [int(x) for x in args]
        kwargs = dict((k, int(v)) for k, v in kwargs.items())
        return func(*args, **kwargs)
    return wrapper


@args_as_ints
def funny_function(x, y, z=3):
    """Computes x*y + 2*z"""
    return x*y + 2*z


print(funny_function("3", 4.0, z="5"))
# 22
help(funny_function)
# Help on function funny_function in module __main__:
#
# funny_function(x, y, z=3)
#     Computes x*y + 2*z

functools.wraps() доступен , по крайней мере, начиная с Python 2.5 , но он не сохраняет подпись там:

help(funny_function)
# Help on function funny_function in module __main__:
#
# funny_function(*args, **kwargs)
#    Computes x*y + 2*z

Уведомление: *args, **kwargs вместо x, y, z=3.

72
ответ дан jfs 24 November 2019 в 04:34
поделиться

Существует модуль декоратора с decorator декоратор, которого можно использовать:

@decorator
def args_as_ints(f, *args, **kwargs):
    args = [int(x) for x in args]
    kwargs = dict((k, int(v)) for k, v in kwargs.items())
    return f(*args, **kwargs)

Тогда подпись и справка метода сохраняются:

>>> help(funny_function)
Help on function funny_function in module __main__:

funny_function(x, y, z=3)
    Computes x*y + 2*z

РЕДАКТИРОВАНИЕ: J. F. Sebastian указал, что я не изменил args_as_ints функция - она фиксируется теперь.

9
ответ дан DzinX 24 November 2019 в 04:34
поделиться

Смотрите на декоратор модуль - конкретно декоратор декоратор, который решает эту проблему.

8
ответ дан Brian 24 November 2019 в 04:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: