Python 如何打印具有上一堆栈名称的变量参数?
我想定义一个log函数,该函数用一条消息调用,后面跟着一个或多个要打印的变量。因此,类似于以下内容:Python 如何打印具有上一堆栈名称的变量参数?,python,inspect,Python,Inspect,我想定义一个log函数,该函数用一条消息调用,后面跟着一个或多个要打印的变量。因此,类似于以下内容: log( "Oh no, error.", x, d) Oh no, error. x = 5 d = { foo: "Foo", goo: "Goo" } 日志的定义类似于: def log( msg, *arg): # Loop through arg, printing caller's variable's name and value. 这将记录到以下文件
log( "Oh no, error.", x, d)
Oh no, error.
x = 5
d = { foo: "Foo", goo: "Goo" }
日志的定义类似于:
def log( msg, *arg):
# Loop through arg, printing caller's variable's name and value.
这将记录到以下文件:
log( "Oh no, error.", x, d)
Oh no, error.
x = 5
d = { foo: "Foo", goo: "Goo" }
这能做到吗?我可以使用inspect打印局部变量和参数,但我不知道是否可以使用前一帧的变量名迭代当前帧中的值。(
inspect.getargvalues(previousFrame)
中的locals
有名称,但也有许多其他名称。)我认为您可以使用类似以下内容:
定义
def log(msg, **kwargs):
print(msg)
for key, value in kwargs.items():
print('{0} = {1}'.format(key,value))
定义(如果订单是必须的)
用法
输出
Oh no, error
y = 6
x = 5
这可能是非常肮脏的,有时可能不起作用(在我的机器上就是这样),但它似乎起到了作用 此外,它不需要所有这些
**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
,也没有问题 如何唯一地确定变量名?如果调用方在名称空间中有y
,并且它的值恰好是5
,该怎么办?如果调用方传递了类似于d['foo']
的消息,该怎么办?您是否需要在调用方的命名空间中任意深入地递归对象?如果他们传递函数调用的结果呢<代码>日志('message',x.bar())?这里有很多案件很难解决。。。虽然您可能可以检查堆栈并打印出调用方的所有局部变量。是的,我想您是对的。那我该怎么办?我必须删除这个帖子吗?也许这是我的一厢情愿,我只是想要一个日志函数,记录我给它的变量。这根本做不到?所以,如果他们通过5,它会打印出5=5。如果他们通过y,则打印y=5。如果他们给它一个对象,它会打印object=str(object)。@Bitdiot,为什么?它写得不差,组织也不差。对我个人来说,这个问题很有趣,这很好,因为它没有使用任何黑魔法。另外,请注意,参数的顺序不一定是您所期望的。。。你说得对,我在这里没有考虑顺序,我应该指出字典是无序的。我已经编辑了答案,我试过了。看起来非常漂亮的代码,但是如果日志超过多行,它似乎会出错。我仍然喜欢它,但我认为我倾向于使用key=val解决方案。