如何使用先前堆栈中的名称打印变量参数?

时间:2015-09-15 16:13:58

标签: python inspect

我想定义一个日志函数,该函数使用一条消息调用,后跟一个或多个要打印的变量。所以,如下所示:

log( "Oh no, error.", x, d)

log定义如下:

def log( msg, *arg):
    # Loop through arg, printing caller's variable's name and value.

这将记录以下文件:

Oh no, error.
    x = 5
    d = { foo: "Foo", goo: "Goo" }

这可以完成吗?我可以使用inspect打印本地和参数,但我不知道是否可以使用前一帧的变量名来迭代当前帧中的值。 (locals中的inspect.getargvalues(previousFrame)有名称,但也有许多其他名称。)

2 个答案:

答案 0 :(得分:4)

我认为你可以使用这样的东西:

定义

def log(msg, **kwargs):
    print(msg)
    for key, value in kwargs.items():
        print('{0} = {1}'.format(key,value))

定义(如果订单是必须的)

def log(msg, **kwargs):
    print(msg)
    for key, value in sorted(kwargs.items()):
        print('{0} = {1}'.format(key,value))

使用

msg='Oh no, error'
log(msg, x=5, y=6)

输出

Oh no, error
y = 6
x = 5

答案 1 :(得分:1)

这可能非常脏并且可能不时工作(它在我的机器上这样做),但它似乎可以解决问题。

此外,它并不需要所有这些**keargs技巧。您只需致电log('Message',as,many,args,as,you,want)即可。

import inspect, gc

def log(msg,*args):
    #This gets the source code line that has to do with args
    #I mean, that calls log
    code=''.join(inspect.getframeinfo(gc.get_referrers(args)[0].f_back).code_context).strip()
    #get the arguments (except msg)
    c=code.split('log')[1].strip()
    c=c.replace('(','').replace(')','')
    c=c.split(',')[1:]
    if c[-1].endswith(';'):
        c[-1]=c[-1].replace(';','')

    for x in xrange(0,len(c)):
        print c[x],'=',args[x]


a=5; b='hello'

print 'test'

log('hello',a,b);

print 'hello'

即使从其他功能运行log,也可以。