如何打印变量的名称和值?

时间:2017-12-31 02:33:51

标签: python

这就是我的想法,因为每当我想检查变量的值时,我发现自己输入了两次名称:

a = 1
my_print(a)  # "a: 1"

这在Python中是否可行?

2 个答案:

答案 0 :(得分:2)

如果您控制了调用函数,那么您可以将其破解为合理地运行:

代码:

import inspect

def print_name_and_value(var):
    lines = inspect.stack()[1][4]
    var_name = ''.join(lines).strip().split('(')[-1].split(')')[0]
    print("%s: %d" % (var_name, var))

a = 5
print_name_and_value(a)

结果:

a: 5

这是如何工作的?

inspect模块可用于检查调用者,并获取调用者使用的代码行。通过一些字符串黑客攻击变量名称(假设它是一个简单的变量而不是更复杂的表达式)可以从源代码中收集。

答案 1 :(得分:1)

我会说“不”,而任何其他神奇的可行只是......太多魔法。

然而你可以做些什么,并且正在使用inspect module查看堆栈跟踪。

import inspect


def my_print(thingy):
    # print("id(thingy)=%s" % id(thingy))
    previous_frame = inspect.currentframe().f_back
    # print("locals: %s" % previous_frame.f_locals)
    for variable_name, variable_value in previous_frame.f_locals.items():
        if id(variable_value) == id(thingy):
            return("%s: %s" % (variable_name, variable_value))

    # print("globals: %s" % previous_frame.f_globals)
    for variable_name, variable_value in previous_frame.f_globals.items():
        if id(variable_value) == id(thingy):
            return("%s: %s" % (variable_name, variable_value))


if __name__ == '__main__':
    a = 1
    print("Test %s" % my_print(a))  # "a: 1"
    list_thingy = [1, 2, 3]
    print("Test %s" % my_print(list_thingy))

    def and_within_function():
        d = {1: "a"}
        print("Test %s" % my_print(d))

    and_within_function()

但这不可靠,我更多地将它用作好奇心,因为有很多“特殊情况”。例如:Python中的前255个整数(我认为)占用了一个特定的内存地址,因此,如果你有两个=1变量,我认为你真的不能保证哪一个是它。< / p>