Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何打印具有上一堆栈名称的变量参数?_Python_Inspect - Fatal编程技术网

Python 如何打印具有上一堆栈名称的变量参数?

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函数,该函数用一条消息调用,后面跟着一个或多个要打印的变量。因此,类似于以下内容:

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解决方案。