【问题标题】:python decorator to print return valuespython装饰器打印返回值
【发布时间】:2015-11-21 00:11:38
【问题描述】:

这个问题涉及 Python 3。 有没有办法让装饰器将返回值打印到任何函数?这个问题Decorator to print function call details - parameters names and effective values 将打印您传递给函数的所有值。有没有办法制作一个装饰器来打印函数返回的任何值,无论它返回单个值还是多个值?

如果你要运行这个:

multiply(subtract(add(1,2),add(3,4)),9)

使用@superecho 装饰的所有函数都会记录:

function call add() 1,2
function add() returns 3
function call add() 3,4
function add() returns 7
function call subtract() 3 7
function subtract() returns -4
function call multiply() -4 9
function multiply() returns -36

【问题讨论】:

    标签: python-3.x return decorator


    【解决方案1】:
    import functools
    
    def monitor_results(func):
        @functools.wraps(func)
        def wrapper(*func_args, **func_kwargs):
            print('function call ' + func.__name__ + '()')
            retval = func(*func_args,**func_kwargs)
            print('function ' + func.__name__ + '() returns ' + repr(retval))
            return retval
        return wrapper
    
    @monitor_results
    def foo():
        return 7
    
    foo()
    # prints:
    #     function call foo()
    #     function foo() returns 7
    

    【讨论】:

      【解决方案2】:

      这符合您的需要吗?

      def describeFuncRet(func):
          def wrapper(*func_args, **func_kwargs):
              print(func(*func_args,**func_kwargs))
          return wrapper
      

      【讨论】:

      • 如果我要运行 multiply(subtract(add(1,2),add(3,4)),9),这条链会正确吗?而不是使用 print(...) 我正在使用 customprinter.print(...)
      • @trident 请将该示例与预期输出一起添加到您的问题中:)
      • 投反对票,因为这会消耗返回值而不是转发它
      猜你喜欢
      • 1970-01-01
      • 2014-06-27
      • 2020-12-04
      • 2020-02-10
      • 1970-01-01
      • 1970-01-01
      • 2014-05-19
      • 2015-08-23
      • 2021-01-17
      相关资源
      最近更新 更多