如何编写函数来返回变量名?

时间:2012-08-30 02:15:39

标签: python

我想要一个可以像这样返回变量/对象名称的函数:

def get_variable_name (input_variable):
    ## some codes

>>get_variable_name(a)
'a'

>>get_variable_name(mylist)
'mylist'

它看起来很傻但我需要函数来构造关于变量的表达式以便稍后在'exec()'上。有人可以帮忙写一下'get_variable_name'吗?

6 个答案:

答案 0 :(得分:7)

我现在已经多次在SO上看过这类问题的一些变种。答案是在您需要名称和对象之间的关联时,学习使用dict稍后您会感谢自己。

回答“我的代码如何发现对象的名称?”这一问题,这里是来自Fredrik Lundh的a quote(在comp.lang.python上):

  

就像你在门廊上找到那只猫的名字一样:   cat(对象)本身不能告诉你它的名字,它没有   非常关心 - 因此找出所谓的问题的唯一方法就是提问   所有邻居(名称空间)如果是他们的猫(对象)......

     

......如果你发现它被许多名字所知,也不要感到惊讶,   或根本没有名字!


注意:技术上可以获取绑定到对象的名称列表,至少在CPython实现中是这样。如果您有兴趣看到演示,请参阅我的答案中显示的inspect模块的用法:

Can an object inspect the name of the variable it's been assigned to?

这种技术只应该在一些疯狂的调试会话中使用,不要在你的设计中使用这样的东西。

答案 1 :(得分:5)

一般来说,这是不可能的。将某些内容传递给函数时,您传递的是对象,而不是名称。同一个对象可以有许多名称或没有名称。如果你拨打get_variable_name(37),该怎么办?您应该考虑为什么要这样做,并尝试找到另一种方法来完成您的实际任务。

编辑:如果您希望get_variable_name(37)返回37,那么如果您执行a=37然后执行get_variable_name(a),那么它也将返回37.一旦进入该函数,它就无法返回知道对象的“名字”在外面是什么。

答案 2 :(得分:0)

def getvariablename(vara):
    for k in globals():
        if globals()[k] == vara:
                  return k
     return str(vara)

可能在某些情况下有效...但很容易破损......我基本上不会在任何类型的生产代码中使用它......

基本上我无法想到这样做的任何好理由......而且大约有一百万不要

答案 3 :(得分:-1)

如果您只想返回基于用户输入选择的变量的名称...那么他们可以跟踪他们的输入,在代码中添加变量名称,除了他们生成的值之外选择。例如:

temp = raw_input('Do you want a hot drink?  Type yes or no. ')
size = raw_input('Do you want a large drink? Type yes or no. ')
if temp and size == 'yes':
    drink = HL
    name = 'Large cafe au lait'
if temp and size != 'yes':
    drink = CS
    name = 'Small ice coffee'
print 'You ordered a ', name, '.'

MJ

答案 4 :(得分:-1)

如果你在exec()中使用的语句是这样的

a = ["ddd","dfd","444"]

然后做这样的事情

exec('b = a = ["ddd","dfd","444"]')

现在你可以使用' b'在您的代码中处理' a'。

答案 5 :(得分:-3)

也许您可以使用traceback.extract_stack()来获取调用堆栈,然后从条目中提取变量名称?

def getVarName(a):
    stack = extract_stack()
    print(stack.pop(-2)[3])

bob = 5
getVarName(bob);

输出:

getVarName(bob)