python - 从修饰函数中获取函数参数和变量名称和值
问题描述
可以让 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}
解决方案
是的,您可以使用该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
模块文档。
推荐阅读
- python - /api/test 类型对象“产品”处的 AttributeError 没有属性“对象”
- sql - 如何检查特定文件夹中的文件名是否在数据库表中?
- python - python:根据IF条件过滤
- python - 在pyspark中展平嵌套的json scala代码
- reactjs - 单击提交按钮后如何使文本区域为空?
- html - gatsby HTML 文件太大(即由于 bootstrap-CSS)
- mysql - 试图通过 mySQL 数据库将数据输入到我的 .NET 程序中
- javascript - JS .animate 在执行完成后将元素重置为原始位置
- jmeter - Jmeter在线程中发现错误时如何停止所有线程的执行
- asp.net-core - 当用户有 2 个角色时,AuthorizeView 不起作用