我想定义一个日志函数,该函数使用一条消息调用,后跟一个或多个要打印的变量。所以,如下所示:
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)
有名称,但也有许多其他名称。)
答案 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
,也可以。