说你有,
foo = 'bar'
d = {'a-key':'a-value'}
你想要
d = {'a-key':'a-value','foo':'bar'}
e = {'foo':foo}
我知道你可以做到,
d['foo'] = foo
#Either of the following for e
e = {'foo':foo}
e = dict(foo=foo)
但是,以这种方式将变量foo添加到dict中,我不得不两次使用单词foo
;一次表示关键,一次表示其价值。
使用foo
两次似乎很浪费。有没有更简单的方法,你可以告诉python “将此变量添加到字典中,其名称为键,其值为值”?
答案 0 :(得分:4)
你可以做这样的事情
def add_dry_foo(d, namespace, fooName):
d[fooName] = namespace[fooName]
foo = 'oh-foo'
d = {}
add_dry_foo(d, locals(), 'foo')
print d
答案 1 :(得分:2)
您可以使用:
name = 'foo'
d[name] = vars[name]
我看不出您的d
和e
案例之间存在差异:都将'foo'设置为foo的值。
如果你想把它埋在一个函数中,它会变得更加棘手:
def add_variable(d, name):
# blah
因为它必须使用inspect
来开始在框架中进行探索。
这听起来像一个更大的问题,如果你想向我们描述它可能有一个更好的解决方案。例如,如果问题是你不关心foo,但实际上是一大堆局部变量,那么你可能想要这样的东西:
d.update(locals())
将所有局部变量的名称和值复制到d
。
答案 2 :(得分:2)
实际上,使用foo
两次在python程序中非常常见。它被广泛用于传递参数,例如
def f(foo, bar):
g(foo=foo)
这是您问题中字典操作的一个特例。
我认为没有办法避免使用magic,所以我认为你必须忍受它。
答案 3 :(得分:1)
要将所有局部变量添加到dict,您可以执行以下操作:
d.update(locals())
同样适用于函数调用:
func(**locals())
请注意,根据您所在的位置locals()
当然可能包含不应该在dict中结束的内容。所以你可以实现一个过滤功能:
def filtered_update(d, namespace):
for key, value in namespace.items():
if not key.startswith('__'):
d[key] = value
filtered_update(d, locals())
当然,Python的哲学是“显式优于隐式”,所以一般来说,我会更加努力地手工完成这些工作(否则你必须要小心你的本地命名空间中发生了什么)。
答案 4 :(得分:1)
如果您不想传递所有locals()
(如果您不完全信任您发送数据的功能可能存在安全风险),那么单行答案可能是这样:
dict([ (var, locals()[var]) for var in ['foo', 'bar'] ])
或在Python 3.0中,这将成为可能:
{ var: locals()[var] for var in ['foo', 'bar'] }
答案 5 :(得分:0)
你可以使用eval,虽然我不确定我会推荐它。
>>> d = dict()
>>> foo = 'wibble'
>>> def add(d, name):
d[name] = eval(name)
>>> add(d, 'foo')
>>> d
{'foo': 'wibble'}
修改强> 我应该指出为什么我不推荐“eval”。如果你这样做会怎么样? (来自:http://mail.python.org/pipermail/tutor/2005-November/042854.html)
>>> s = "(lambda loop: loop(loop)) (lambda self: self(self))"
>>> add(d, s)
Traceback (most recent call last):
File "<pyshell#54>", line 1, in <module>
add(d, s)
File "<pyshell#43>", line 2, in add
d[name] = eval(name)
File "<string>", line 1, in <module>
File "<string>", line 1, in <lambda>
File "<string>", line 1, in <lambda>
...
File "<string>", line 1, in <lambda>
RuntimeError: maximum recursion depth exceeded
答案 6 :(得分:0)
在我看来,你所谈论的是一个 增强参数传递功能:
def func(*vars):
提供没有键的有序值元组
def func(**vars):
提供键值对的字典 必须以 key = value 对传递。
def func(***vars):
将提供关键值对的字典, 明确地传递为 key = value , 或隐含地为键(变量, 文字会在没有 key = )的情况下导致错误
SO:
(x1,x2,x3) = (1,2,3)
def myfunc(***vars):
retrun vars
myfunc(x1,x2,x3)
>>> {'x1':1,'x2':2,'x3':3}
但当然,这只是一厢情愿的想法......