如何在Python中获取对象的名称?

2024-09-27 22:19:13 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有办法在Python中获取对象的名称?例如:

my_list = [x, y, z] # x, y, z have been previously defined

for bla in my_list:
    print "handling object ", name(bla) # <--- what would go instead of `name`?
    # do something to bla

编辑:某些上下文:

我实际上在做的是创建一个可以通过命令行指定的函数列表。

我有:

def fun1:
    pass
def fun2
    pass
def fun3:
    pass

fun_dict = {'fun1': fun1,
            'fun2': fun2,
            'fun3': fun3}

我从命令行获取函数名,并调用相关函数:

func_name = parse_commandline()

fun_dict[func_name]()

我之所以想要这个函数的名字,是因为我想创建fun_dict而不需要写两次函数的名字,因为这看起来是一个创建bug的好方法。我想做的是:

fun_list = [fun1, fun2, fun3] # and I'll add more as the need arises

fun_dict = {}
[fun_dict[name(t) = t for t in fun_list] # <-- this is where I need the name function

这样我只需要写一次函数名。


Tags: 函数命令行nameinformydefpass
3条回答

如果要获取解释器中定义的函数、lambda或其他类似函数的对象的名称,可以使用^{}中的dill.source.getname。它几乎在寻找__name__方法,但在某些情况下,它知道如何找到名称的其他魔力。。。或对象的名称。我不想讨论如何为python对象找到一个真正的名字。

>>> from dill.source import getname
>>> 
>>> def add(x,y):
...   return x+y
... 
>>> squared = lambda x:x**2
>>> 
>>> print getname(add)
'add'
>>> print getname(squared)
'squared'
>>> 
>>> class Foo(object):
...   def bar(self, x):
...     return x*x+x
... 
>>> f = Foo()
>>> 
>>> print getname(f.bar)
'bar'
>>> 
>>> woohoo = squared
>>> plus = add
>>> getname(woohoo)
'squared'
>>> getname(plus)
'add'

对象在python中不一定有名称,因此无法获取名称。 在这些情况下,对象有一个__name__属性并不罕见,但这不是标准python的一部分,而且大多数内置类型没有名称。

当您创建一个变量时,比如上面的x,y,z,这些名称只是作为对象的“指针”或“引用”。对象本身不知道您要为它使用什么名称,并且您不容易(如果有的话)获得对该对象的所有引用的名称。

更新:但是,函数确实有一个__name__(除非它们是lambdas),因此,在这种情况下,您可以:

dict([(t.__name__, t) for t in fun_list])

这是不可能的,因为可能有多个变量具有相同的值,或者一个值可能没有变量,或者一个值可能与一个变量具有相同的值只是偶然的。

如果你真的想这么做,你可以用

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

相关问题 更多 >

    热门问题