如何在 python 中打印变量名称?[重复]

2024-12-17 08:30:00
admin
原创
139
摘要:问题描述:假设我有一个名为choiceit is equal to 2 的变量。我该如何访问该变量的名称?相当于In [53]: namestr(choice) Out[53]: 'choice' 用于制作字典。有一个很好的方法可以做到这一点,但我却错过了。编辑:这样做的原因如下。我正在运行一些数据分析程序,...

问题描述:

假设我有一个名为choiceit is equal to 2 的变量。我该如何访问该变量的名称?相当于

In [53]: namestr(choice)
Out[53]: 'choice'

用于制作字典。有一个很好的方法可以做到这一点,但我却错过了。

编辑:

这样做的原因如下。我正在运行一些数据分析程序,我使用多个参数调用程序,这些参数我想在运行时进行调整或不进行调整。我从格式为 .config 的文件中读取了上次运行中使用的参数

filename
no_sig_resonance.dat

mass_peak
700

choice
1,2,3

当提示输入值时,将显示先前使用的值,而空字符串输入将使用先前使用的值。

我的问题是因为在编写这些值被扫描到的字典时。如果需要一个参数,我会运行get_param访问文件并找到该参数。

我认为通过读取 . 文件一次并从中生成字典,我将完全避免这个问题config。我最初避免这样做是因为......原因我已记不清了。这是更新我的代码的绝佳情况!


解决方案 1:

如果您坚持的话,这里有一些基于检查的可怕的解决方案。

import inspect, re

def varname(p):
  for line in inspect.getframeinfo(inspect.currentframe().f_back)[3]:
    m = re.search(r'varnames*(s*([A-Za-z_][A-Za-z0-9_]*)s*)', line)
    if m:
      return m.group(1)

if __name__ == '__main__':
  spam = 42
  print varname(spam)

我希望它能够激励您重新评估您遇到的问题并寻找另一种方法。

解决方案 2:

回答你最初的问题:

def namestr(obj, namespace):
    return [name for name in namespace if namespace[name] is obj]

例子:

>>> a = 'some var'
>>> namestr(a, globals())
['a']

我们可以使用inspect模块获取调用者的命名空间:

import inspect

def names_in_caller(obj, depth=2) -> list[str]:
    """Return *obj*'s names in the caller namespace.

    Default *depth* is 2 meaning that caller's caller names 
    are returned
    """ 
    f = inspect.currentframe()
    for _ in range(depth):
        f = f.f_back
    return namestr(obj, f.f_locals)

例子:

>>> def f(n):
...     n_name = name_in_caller(n)  # find name in the caller
...     return f"{n_name}={n}"  # like f"{n=}" but with callers' name
... 
>>> a = 1
>>> f(a)
"['a']=1"
>>> b = 1
>>> f(a)
"['a', 'b']=1"

正如@rbright 已经指出的那样,无论您做什么,都可能有更好的方法来做。

解决方案 3:

如果您尝试这样做,则说明您做错了。请考虑改用dict

def show_val(vals, name):
    print "Name:", name, "val:", vals[name]

vals = {'a': 1, 'b': 2}
show_val(vals, 'b')

输出:

Name: b val: 2

解决方案 4:

我建议你描述一下你面临的问题,而不是询问具体解决方案的细节;我认为你会得到更好的答案。我这样说是因为几乎肯定有更好的方法来完成你想做的事情。在任何语言中,以这种方式访问​​变量名通常都不是解决问题的必要条件。

也就是说,所有变量名都已存在于字典中,可通过内置函数locals和globals访问。根据检查的范围使用正确的一个。

检查这些字典的几个常见习惯用法之一是为了简单的字符串插值:

>>> first = 'John'
>>> last = 'Doe'
>>> print '%(first)s %(last)s' % globals()
John Doe

尽管它需要通过名称检查变量,但这种方法比其他方法更易于阅读。

解决方案 5:

你不能,因为 Python 中没有变量,只有名称。

例如:

> a = [1,2,3]
> b = a
> a is b
True

a这两个中哪一个是正确的变量?和之间没有区别b

之前也有过类似的问题。

解决方案 6:

这样的事情对你有用吗?

>>> def namestr(**kwargs):
...     for k,v in kwargs.items():
...       print "%s = %s" % (k, repr(v))
...
>>> namestr(a=1, b=2)
a = 1
b = 2

在您的示例中:

>>> choice = {'key': 24; 'data': None}
>>> namestr(choice=choice)
choice = {'data': None, 'key': 24}
>>> printvars(**globals())
__builtins__ = <module '__builtin__' (built-in)>
__name__ = '__main__'
__doc__ = None
namestr = <function namestr at 0xb7d8ec34>
choice = {'data': None, 'key': 24}

解决方案 7:

通过急切求值,变量基本上会在您查看它们时随时变成它们的值(解释一下)。也就是说,Python 确实有内置命名空间。例如,locals() 将返回一个将函数变量的名称映射到其值的字典,globals() 对模块执行相同操作。因此:

for name, value in globals().items():
    if value is unknown_variable:
        ... do something with name

请注意,您不需要导入任何内容就可以访问 locals() 和 globals()。

此外,如果一个值有多个别名,则遍历命名空间只会找到第一个。

解决方案 8:

对于如何读取配置参数的修改问题,我强烈建议您节省一些时间和精力并使用ConfigParser或(我首选的工具)ConfigObj。

它们可以满足您的所有需求,并且易于使用,而且其他人已经担心如何让它们正常工作了!

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用