我想要一个可以像这样返回变量/对象名称的函数:
def get_variable_name (input_variable):
## some codes
>>get_variable_name(a)
'a'
>>get_variable_name(mylist)
'mylist'
它看起来很傻,但我需要该函数来构造关于变量的表达式,以便稍后在“exec()”中使用。有人可以帮助编写“get_variable_name”吗?
我想要一个可以像这样返回变量/对象名称的函数:
def get_variable_name (input_variable):
## some codes
>>get_variable_name(a)
'a'
>>get_variable_name(mylist)
'mylist'
它看起来很傻,但我需要该函数来构造关于变量的表达式,以便稍后在“exec()”中使用。有人可以帮助编写“get_variable_name”吗?
我现在已经在 SO 上多次看到此类问题的一些变体。答案是不要。 学习在dict
需要名称和对象之间关联的任何时候使用。 稍后你会为此感谢自己。
在回答“我的代码如何发现对象的名称?”这个问题时,引用Fredrik Lundh(在 comp.lang.python 上)的一段话:
就像你得到你在门廊上发现的那只猫的名字一样:猫(物体)本身不能告诉你它的名字,它并不真正关心 - 所以找出它叫什么的唯一方法是问你所有的邻居(命名空间),如果它是他们的猫(对象)......</p>
....如果您发现它有很多名字,或者根本没有名字,请不要感到惊讶!
注意:至少在 CPython 实现中,获取绑定到对象的名称列表在技术上是可行的。如果您有兴趣看到演示,请在inspect
此处查看我的答案中显示的模块的用法:
这种技术应该只在一些疯狂的调试会话中使用,不要在你的设计中使用这样的东西。
一般来说,这是不可能的。当您将某些东西传递给函数时,您传递的是对象,而不是名称。同一个对象可以有多个名称或没有名称。如果您调用该函数应该做什么get_variable_name(37)
?你应该想想你为什么要这样做,并尝试找到另一种方法来完成你的真正任务。
编辑:如果你想get_variable_name(37)
返回 37,那么如果你做a=37
然后做get_variable_name(a)
,那也将返回 37。一旦进入函数,它就无法知道对象的“名称”在外面是什么。
def getvariablename(vara):
for k in globals():
if globals()[k] == vara:
return k
return str(vara)
在某些情况下可能会起作用...但很容易损坏...而且我基本上永远不会在任何类型的生产代码中使用它...
基本上我想不出有什么好的理由这样做……大约有一百万不这样做
这是一个好的开始,取决于 Python 版本和运行时,您可能需要稍作调整。打个断点,花点时间了解一下结构inspect.currentframe()
import inspect
def vprint(v):
v_name = inspect.currentframe().f_back.f_code.co_names[3]
print(f"{v_name} ==> {v}")
if __name__ == '__main__':
x = 15
vprint(x)
会产生
x ==> 15
如果您只想返回根据用户输入选择的变量的名称......以便他们可以跟踪他们的输入,除了从他们的选择中生成的值之外,在他们进行选择时在代码中添加一个变量名称。例如:
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, '.'
乔丹
如果您要在 exec() 中使用的语句是这样的
a = ["ddd","dfd","444"]
然后做这样的事情
exec('b = a = ["ddd","dfd","444"]')
现在您可以在代码中使用“b”来处理“a”。
也许您可以使用 traceback.extract_stack() 获取调用堆栈,然后从条目中提取变量名称?
def getVarName(a):
stack = extract_stack()
print(stack.pop(-2)[3])
bob = 5
getVarName(bob);
输出:
getVarName(bob)