繁体   English   中英

动态构建键:变量列表的值查找

[英]Dynamically build key: value lookup for list of variables

假设我有一些变量:

a, b, c, d, e = range(5)

我想将这些变量的值保存在文件中以供以后检查。 我认为做到这一点的一种方法是:

lookup = {
    'a': a,
    'b': b,
    'c': c,
    'd': d,
    'e': e
}

就像您想象的那样,使用大量变量,这可能会变得乏味。 而且,是的,我知道许多编辑器都具有简化这种复制粘贴操作的功能。 但是我正在寻找动态构建键的标准“ Pythonic”方法:值查找,其中键是变量的名称,而值是变量的值!

我想到了:

>>> {var.__name__: var for var in [a, b, c, d, e]}
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in <dictcomp>
AttributeError: 'int' object has no attribute '__name__'

我并不奇怪这没有用,因为整数变量是常量(我不确定描述事物的确切方法):

>>> a = 1
>>> b = 1
>>> a is b
True
>>> b is a
True
>>> a == b
True

我该怎么做?

import itertools

data = range(5)

result = {f"a{count}": value for count, value in zip(itertools.count(1), data)}

print(result)

输出:

{'a1': 0, 'a2': 1, 'a3': 2, 'a4': 3, 'a5': 4}

您可能需要调查locals()检查 结果可能是:

>>> from inspect import ismodule
>>> a = 1
>>> b = 1
>>> dict((k, v) for k, v in locals().items() if not k.startswith("__") and not callable(v) and not ismodule(v))
{'a': 1, 'b': 1}

但是要正确处理,您可能需要添加一些附加条件,并且还必须注意可变的对象或值,因为在这种情况下,这些对象或值会发生变异,并且您将不会保留较早的值以供以后检查。 序列化或复制它们可能会有所帮助。

您可以从另一个方向处理它,并使用locals()保存所有局部变量,例如

import json
def foo(a=None, bb=None):
    ccc='lots of c'; de=42
    print( json.dumps( locals() ))

foo()生成{"a": null, "bb": null, "ccc": "lots of c", "de": 42}

json.dumps是序列化dict的一种方法,并且仅适用于可以转换为JSON的简单变量)

获得一些变量的另一种方法是

print( json.dumps( dict( a=a, b=b, c=c) ))

这是从string模块使用ascii_lowercase另一种方法:

import string

alphabets = iter(string.ascii_lowercase)
lookup = {next(alphabets): x for x in range(5)}

print(lookup)
# {'a': 0, 'b': 1, 'c': 2, 'd': 3, 'e': 4}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM