从修饰函数获取函数参数和变量名称和值

2024-04-25 07:56:49 发布

您现在位置:Python中文网/ 问答频道 /正文

可以让logger decorator打印修饰函数的变量名和值

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}

Tags: 函数addreturndefargsdecoratorvarslogger
1条回答
网友
1楼 · 发布于 2024-04-25 07:56:49

是的,您可以使用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

请注意SignatureBoundArguments都有额外的信息,如果您深入研究它们,您可以获得这些信息。有关更多信息,请参见^{} module docs

相关问题 更多 >