我如何获取对象的名称?

56 投票
19 回答
219784 浏览
提问于 2025-04-15 14:55

假设我有这样的代码:

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

 

59

在Python中,对象不一定有名字,所以你不能直接获取它的名字。

当你创建一个变量,比如上面的x, y, z,这些名字其实只是指向对象的“指针”或“引用”。对象本身并不知道你给它起了什么名字,而且你也很难(如果不是不可能的话)获取到所有指向这个对象的名字。

不过,很多对象都有一个叫做__name__的属性。函数是有__name__的(除非它们是lambda函数),所以我们可以通过一些方法来构建fun_dict,比如:

fun_dict = {t.__name__: t for t in fun_list)

撰写回答