我如何获取对象的名称?
假设我有这样的代码:
x = 0
y = 1
z = 2
my_list = [x, y, z]
for item in my_list:
print("handling object ", name(item)) # <--- what would go instead of `name`?
我该如何在Python中获取每个对象的名称呢?也就是说:我可以在这段代码中把name
替换成什么,这样循环就会显示处理对象 x
,然后是处理对象 y
和处理对象 z
?
在我的实际代码中,我有一个函数字典,我会在用户输入后查找并调用这些函数:
def fun1():
pass
def fun2():
pass
def fun3():
pass
fun_dict = {'fun1': fun1,
'fun2': fun2,
'fun3': fun3}
# suppose that we get the name 'fun3' from the user
fun_dict['fun3']()
我该如何自动创建fun_dict
,而不需要把函数的名称写两遍?我希望能够写一些像这样的代码:
fun_list = [fun1, fun2, fun3] # and I'll add more as the need arises
fun_dict = {}
for t in fun_list:
fun_dict[name(t)] = t
以避免重复写名称。
19 个回答
11
这一行代码可以在所有类型的对象上使用,只要它们在 globals()
字典里,而它们应该是这样的:
def name_of_global_obj(xx):
return [objname for objname, oid in globals().items()
if id(oid)==id(xx)][0]
或者,换句话说:
def name_of_global_obj(xx):
for objname, oid in globals().items():
if oid is xx:
return objname
17
这其实是不太可能的,因为可能有多个变量的值是相同的,或者一个值可能没有对应的变量,或者一个值和某个变量的值相同只是碰巧。
如果你真的想这么做,可以使用
def variable_for_value(value):
for n,v in globals().items():
if v == value:
return n
return None
不过,最好还是先遍历一下名字:
my_list = ["x", "y", "z"] # x, y, z have been previously defined
for name in my_list:
print "handling variable ", name
bla = globals()[name]
# do something to bla