0

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

def get_variable_name (input_variable):
    ## some codes

>>get_variable_name(a)
'a'

>>get_variable_name(mylist)
'mylist'

它看起来很傻,但我需要该函数来构造关于变量的表达式,以便稍后在“exec()”中使用。有人可以帮助编写“get_variable_name”吗?

4

7 回答 7

7

我现在已经在 SO 上多次看到此类问题的一些变体。答案是不要学习在dict需要名称和对象之间关联的任何时候使用。 稍后你会为此感谢自己。

在回答“我的代码如何发现对象的名称?”这个问题时,引用Fredrik Lundh(在 comp.lang.python 上)的一段话:

就像你得到你在门廊上发现的那只猫的名字一样:猫(物体)本身不能告诉你它的名字,它并不真正关心 - 所以找出它叫什么的唯一方法是问你所有的邻居(命名空间),如果它是他们的猫(对象)......</p>

....如果您发现它有很多名字,或者根本没有名字,请不要感到惊讶!


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

对象可以检查分配给它的变量的名称吗?

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

于 2012-08-30T02:35:20.173 回答
5

一般来说,这是不可能的。当您将某些东西传递给函数时,您传递的是对象,而不是名称。同一个对象可以有多个名称或没有名称。如果您调用该函数应该做什么get_variable_name(37)?你应该想想你为什么要这样做,并尝试找到另一种方法来完成你的真正任务。

编辑:如果你想get_variable_name(37)返回 37,那么如果你做a=37然后做get_variable_name(a),那也将返回 37。一旦进入函数,它就无法知道对象的“名称”在外面是什么。

于 2012-08-30T02:17:36.963 回答
0
def getvariablename(vara):
    for k in globals():
        if globals()[k] == vara:
                  return k
     return str(vara)

在某些情况下可能会起作用...但很容易损坏...而且我基本上永远不会在任何类型的生产代码中使用它...

基本上我想不出有什么好的理由这样做……大约有一百万不这样做

于 2012-08-30T02:26:16.097 回答
0

这是一个好的开始,取决于 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
于 2022-02-25T02:39:17.803 回答
-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, '.'

乔丹

于 2013-02-03T19:07:36.697 回答
-1

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

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

然后做这样的事情

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

现在您可以在代码中使用“b”来处理“a”。

于 2018-05-10T10:11:40.840 回答
-2

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

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

bob = 5
getVarName(bob);

输出:

getVarName(bob)
于 2012-08-30T02:46:45.160 回答