将变量名作为字符串获取

429

我已经阅读了如何将函数名作为字符串获取?

那么如何针对变量做同样的事情呢?与函数不同,Python 变量没有 __name__ 属性。

换句话说,如果我有一个变量,例如:

foo = dict()
foo['bar'] = 2
我正在寻找一个函数/属性,例如retrieve_name(),以便从这个列表中在Pandas中创建一个DataFrame,其中列名由实际字典的名称给出。
# List of dictionaries for my DataFrame
list_of_dicts = [n_jobs, users, queues, priorities]
columns = [retrieve_name(d) for d in list_of_dicts] 

1
对于常量,您可以使用支持检索其名称的枚举。 - Dana
2
我遇到了类似的问题。我意识到,与其将原始数据存储为一系列事物列表,不如将其存储为一系列事物字典(如果需要,您可以轻松地从字典中即时生成列表)。例如,假设您有:my_dict = {'n_jobs': ...,'users': ...}。然后,您可以使用my_dict ['n_jobs']代替n_jobs。无论如何,对我来说重要的是,我只需要一次输入“n_jobs”,无论是作为变量名称还是作为字典键中的字符串。 - Ying Zhang
变量并不是“有名字的”;在Python中,“变量”和“名称”意思相同。你可能是指(即被命名的实际对象);但事实上,值并没有“拥有”名称——它们被命名。换句话说,名称持有(保留)值。任何值都可以被命名任意次数,包括零次。 - Karl Knechtel
谢谢你的问题。我正在尝试弄清楚如何在写入结果的文件名中使用变量名(例如将名为'data'的数据框写入'data.csv'),这在具有中间结果的流水线中非常有用。使用变量名可以提供清晰且自动生成的引用。 - Rony Armon
35个回答

0
iDilip 的回答的压缩版本:
import inspect
def varname(x):
  return [k for k,v in inspect.currentframe().f_back.f_locals.items() if v is x][0]

hi = 123
print(varname(hi))

如果您只需要一个匹配变量,则此选项是正确的。原始答案将返回所有匹配的变量。 - FrankZhu

0

我试图从检查局部变量中获取名称,但它无法处理类似a[1]、b.val这样的变量。 之后,我想到了一个新的方法——从代码中获取变量名,并且我成功地尝试了它! 代码如下:

#direct get from called function code
def retrieve_name_ex(var):
    stacks = inspect.stack()
    try:
        func = stacks[0].function
        code = stacks[1].code_context[0]
        s = code.index(func)
        s = code.index("(", s + len(func)) + 1
        e = code.index(")", s)
        return code[s:e].strip()
    except:
        return ""

0
您可以尝试以下方法来检索您定义的函数名称(但无法用于内置函数):
import re
def retrieve_name(func):
    return re.match("<function\s+(\w+)\s+at.*", str(func)).group(1)

def foo(x):
    return x**2

print(retrieve_name(foo))
# foo

0

我认为如果我们使用global.items()local.items()函数,我们将能够获取变量名。在当前情况下,字典位于列表中,因此我们需要查看迭代中获取的字典是否与列表中的字典匹配。如果它们匹配,则获取字典的名称。

# Iterate over all global/local variables

for name, value in locals().items():

    for i, mydict in enumerate(list_of_dicts):

        # Check if the value matches the dictionary we're interested in
        if value is mydict:

            # Print the variable name as a string
            print("Variable name:", name)

0
我使用这个小代码片段来调试宏。
from inspect import currentframe, getframeinfo_
def p(var): # print variable and its name
    in_fo = getframeinfo(currentframe().f_back)
    co_de = str(in_fo.code_context)
    na_me = co_de[
    co_de.index('(')+1:co_de.index(')')]
    print("Line "+str(in_fo.lineno)+": "
    +na_me+" is "+str(var))

中间带下划线的奇怪名称是为了降低'var'别名风险。p(r1)生成

第154行:r1为13.999013120731464


如果您将第二个“index”替换为“rindex”,则该函数将在参数为表达式时正确运行,除非表达式包含字符串内的任何)'。要打印多个带有名称的参数,请使用index(',')。 - Richard Parkins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接