首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >打印传递给函数的变量的名称

打印传递给函数的变量的名称
EN

Stack Overflow用户
提问于 2012-03-30 14:36:08
回答 4查看 3.9K关注 0票数 5

在某些情况下,我想打印调试样式的输出,如下所示:

代码语言:javascript
复制
# module test.py
def f()
  a = 5
  b = 8
  debug(a, b) # line 18

我希望debug函数打印以下内容:

代码语言:javascript
复制
debug info at test.py: 18
function f
a = 5
b = 8

我认为这应该可以通过使用inspect模块来定位堆栈框架,然后找到适当的行,查找该行中的源代码,从那里获得参数的名称。函数名可以通过上移一个栈帧来获得。(参数的值很容易获得:它们直接传递给函数debug。)

我在正确的轨道上吗?有什么我可以参考的食谱吗?

EN

回答 4

Stack Overflow用户

发布于 2012-03-30 14:43:44

您可以按照以下方式做一些事情:

代码语言:javascript
复制
import inspect

def debug(**kwargs):
  st = inspect.stack()[1]
  print '%s:%d %s()' % (st[1], st[2], st[3])
  for k, v in kwargs.items():
    print '%s = %s' % (k, v)

def f():
  a = 5
  b = 8
  debug(a=a, b=b) # line 12

f()

这将打印出来:

代码语言:javascript
复制
test.py:12 f()
a = 5
b = 8
票数 3
EN

Stack Overflow用户

发布于 2012-03-30 14:46:55

虽然使用AOP来完成这类任务会更容易,但通常您做得是对的。基本上,不是每次都对每个变量调用"debug“,而是只需要用方面来装饰代码,这些方面在某些事件上做某些事情,比如在进入函数以打印传递的变量及其名称时。

有关更多信息,请参考this网站和旧的so post

票数 1
EN

Stack Overflow用户

发布于 2012-03-30 14:50:14

是的,你在正确的轨道上。您可能希望查看inspect.getargspec,它将返回传递给函数的参数、变量、关键字和默认值的命名元组。

代码语言:javascript
复制
import inspect

def f():
  a = 5
  b = 8
  debug(a, b)


def debug(a, b):
    print inspect.getargspec(debug)
f()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9938082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档