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

Bit*_*iot 7 python inspect

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

log( "Oh no, error.", x, d)
Run Code Online (Sandbox Code Playgroud)

log将被定义为sorta,如:

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

这将记录以下文件:

Oh no, error.
    x = 5
    d = { foo: "Foo", goo: "Goo" }
Run Code Online (Sandbox Code Playgroud)

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

jln*_*ais 4

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

定义

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

定义(如果必须按顺序)

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

用法

msg='Oh no, error'
log(msg, x=5, y=6)
Run Code Online (Sandbox Code Playgroud)

输出

Oh no, error
y = 6
x = 5
Run Code Online (Sandbox Code Playgroud)

  • 这很好,因为它不使用任何黑魔法。另外[显式优于隐式](https://www.python.org/dev/peps/pep-0020/)。 (2认同)
  • 请注意,参数的顺序不一定是您所期望的... http://stackoverflow.com/questions/8977594/in-python-what-defines-the-order-while-iteating-through-kwargs (2认同)