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

时间:2019-02-07 15:16:41

标签: python

假设我有一些变量:

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

我该怎么做?

4 个答案:

答案 0 :(得分:1)

DateTime.Now

输出:

import itertools

data = range(5)

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

print(result)

答案 1 :(得分:1)

您可能想研究locals()inspect。结果可能是:

>>> 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}

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

答案 2 :(得分: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是序列化字典的一种方法,并且仅适用于可以转换为JSON的简单变量)

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

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

答案 3 :(得分:0)

这是使用ascii_lowercase模块中的string的另一种方式:

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}