首页 > 解决方案 > 从修饰函数中获取函数参数和变量名称和值

问题描述

可以让 logger 装饰器打印被装饰函数的变量名和值

def logger(f):
  def inner(*args):
    f(*args)
    print(vars())
  return inner 

@logger
def add(a,b):
  c = 5
  d = a + b +c
  return d

add(1,2)

输出:

{'args': (1, 2)}

预期输出:

{'d': 8, 'c': 5, 'b': 2, 'a': 1}

标签: pythonpython-3.xpython-decorators

解决方案


是的,您可以使用该inspect模块来获取有关传递给函数的参数的信息,或者您可以从func.__code__.co_varnames.

例如:

import inspect


def logger(f):
  def inner(*args):
    print(f'signature: {inspect.signature(f)}')
    print(f'variables: {f.__code__.co_varnames}')
    return f(*args)
  return inner 


@logger
def add(a,b):
  c = 5
  d = a + b +c
  return d

结果:

>>> add(4,5)
signature: (a, b)
variables: ('a', 'b', 'c', 'd')
14

无法获取内部变量的值,但可以获取参数的值:

def logger(f):
  def inner(*args):
    print(f'signature: {inspect.signature(f).bind(*args)}')
    return f(*args)
  return inner 

结果:

>>> add(9,10)
signature: <BoundArguments (a=9, b=10)>
24

请注意,Signature如果BoundArguments您深入研究它们,您可以获得更多信息。有关更多信息,请参阅inspect模块文档


推荐阅读