2012-08-30 34 views
-1
返回变量名

我希望能够返回变量/对象的名称作为海峡这样的功能:如何编写一个函数在Python

def get_variable_name (input_variable): 
    ## some codes 

>>get_variable_name(a) 
'a' 

>>get_variable_name(mylist) 
'mylist' 

看起来很傻,但我需要的功能来构建关于'exec()'后面的变量的表达式。有人可以帮助如何编写'get_variable_name'吗?

+0

这是* FAR *更多的工作比你想这样做。 –

+1

http://stackoverflow.com/questions/582056/getting-list-of-parameters-inside-python-function – squiguy

+0

你为什么要这样做?我几乎肯定有一个更好的方法来做你想做的事(我的意思是超出你给出的简短解释) –

回答

6

我已经看到几个这种类型的问题在SO现在几个变种。答案是不要学习如何在需要名称与对象之间的关联时使用dict你稍后会感谢你。

在回答这个问题:“我的代码如何可以发现一个对象的名称?”,这里的a quote从弗雷德里克Lundh开发(在comp.lang.python):

相同的方式,你得到的你在门廊找到的那只猫的名字: 这只猫(物体)本身不能告诉你它的名字,而且它并不是 真的很在意 - 所以唯一的办法是找出它的名字是 你所有的邻居命名空间)如果它是他们的猫(对象)...

...。并且不要惊讶,如果你会发现在众所周知的名字中, 或者根本没有名字!


注:这是技术上可能得到这必将为对象,在CPython的实现,至少在名称的列表。如果你有兴趣看到演示,看到我的答案在这里所示的inspect模块的使用:

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

这种技术只在一些疯狂的调试会话使用,不使用任何类似这在你的设计中。

+0

请注意,即使该链接也会给出一个对象名称* s *(复数)的列表。没有像对象的“*名称”这样的事情。 – BrenBarn

5

一般来说这是不可能的。当你传递某个函数时,你传递的是对象,而不是名称。同一个对象可以有许多名字或没有名字。如果您致电get_variable_name(37),应该做的功能是什么?你应该考虑你为什么要这样做,并试图找到另一种方式来完成你的真实任务。

编辑:如果您想get_variable_name(37)返回37,那么如果你a=37,然后做get_variable_name(a),这也将返回37.一旦里面的功能,它无法知道什么对象的“名”在外面的道路。

+1

我希望ro返回'37' – bigbug

+0

返回'a',对吧? –

+0

林不知道什么是“不可能的”,但说这将是非常困难和hackey,并有可能破裂 –

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

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

基本上我想不出什么好理由做到这一点... ...和大约一百万不到

-3

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

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

bob = 5 
getVarName(bob); 

输出:

getVarName(bob) 
0

,如果你只是想返回基于用户输入所选择的变量的名字......这样他们就可以跟踪他们的意见,在添加一个变量名代码,因为他们除了从他们的选择中产生的值之外还进行选择。例如:

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

+0

根据用户输入返回一个变量名称以提供交互式反馈。 – MJWoodwardGreene