打印输出变量名称的函数

打印输出变量名称的函数,第1张

打印输出变量名称函数

TL; DR:由于名称绑定在Python中是如何工作的,通常 您无法 获得传递给函数的变量的名称。一些Python对象 确实
具有name属性,但这与您在赋值语句中绑定到对象的名称不同。

您的代码在打印

id
s时给您误导性信息。您实际上不是在打印
id
对象的,而是在中打印
id
名称字符串的
locals()
dict

同样,当您进入

locals()
函数内部时,它会向您显示该函数本地的内容。因此,要获取有关函数外部的本地对象的信息,您需要使函数能够访问
locals()
您感兴趣的实际字典。

下面是代码的修改后的版本,可修复

id
这些问题并将
locals()
数据的副本传递给该
addr_type
函数。

请注意,当您为

a
或调用函数时,
c
它会同时打印两个名称的信息。

我还添加了几行内容,显示了如何使用函数的属性
打印函数的名称

__name__
。请注意,当我们打印
new_name.__name__
它时,只打印了
addr_type
,因为那是函数
__name__
属性的值,所以我们也将其绑定到的事实
new_name
是无关紧要的。

#!/usr/bin/env pythondef addr_type(context, obj):    for k, v in context:        # if id(v) == id(a):        if v is obj: print "k: %s" % k print "v: %s" % v print "a: %s" % hex(id(v)) print    print 15 * "-"a = b = c = 10b = 11for k, v in list(locals().iteritems()):    if k.startswith('__'):        continue    print "k: %s" % k    print "v: %s" % v    print "a: %s" % hex(id(v))    print "##############"printif a is b:    print "a and b is the same objects"else:    print "a and b is NOT the same objects"if a is c:    print "a and c is the same objects"else:    print "a and c is NOT the same objects"if b is c:    print "b and c is the same objects"else:    print "b and c is NOT the same objects"printcontext = list(locals().iteritems())addr_type(context, a)addr_type(context, b)addr_type(context, c)new_name = addr_typeprint 'Function names =', addr_type.__name__, new_name.__name__

输出

k: av: 10a: 0x8dafd24##############k: cv: 10a: 0x8dafd24##############k: bv: 11a: 0x8dafd18##############k: addr_typev: <function addr_type at 0xb748e17c>a: 0xb748e17cL##############a and b is NOT the same objectsa and c is the same objectsb and c is NOT the same objectsk: av: 10a: 0x8dafd24k: cv: 10a: 0x8dafd24---------------k: bv: 11a: 0x8dafd18---------------k: av: 10a: 0x8dafd24k: cv: 10a: 0x8dafd24---------------Function names = addr_type addr_type

您可能会发现研究由Stack Overflow资深Ned
Batchelder撰写的关于Python名称和值的精彩事实和神话,对您有所帮助。


更新资料

这是一个简单的函数,

show
它打印您通过它的名称,以及在您也通过它的字典中该名称的值。通过将
locals()
字典传递给字典,这使它可以按名称在本地范围内查找对象。在函数内部,这是函数的局部变量。在函数之外,这就是所有全局变量。

def show(*args, names):    for s in args:        print(s, names.get(s, 'Not found!'))def test(t):    a = 1    b = 2    c = 3    show('a', 'b', 'c', 't', names=locals())test(42)

输出

a 1b 2c 3t 42


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5664106.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存