我想要一个可以像这样返回变量/对象名称的函数:
def get_variable_name (input_variable):
## some codes
>>get_variable_name(a)
'a'
>>get_variable_name(mylist)
'mylist'
它看起来很傻但我需要函数来构造关于变量的表达式以便稍后在'exec()'上。有人可以帮忙写一下'get_variable_name'吗?
答案 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)