从局部变量创建python字典最简洁的方法

时间:2012-10-08 06:30:51

标签: python dictionary

在Objective-C中,您可以使用NSDictionaryOfVariableBindings宏来创建像这样的字典

NSString *foo = @"bar"
NSString *flip = @"rar"
NSDictionary *d = NSDictionaryOfVariableBindings(foo, flip)
// d -> { 'foo' => 'bar', 'flip' => 'rar' }

python中有类似的东西吗?我经常发现自己编写这样的代码

d = {'foo': foo, 'flip': flip}
# or
d = dict(foo=foo, flip=flip)

有没有做这样的事情的快捷方式?

d = dict(foo, flip) # -> {'foo': 'bar', 'flip': 'rar'}

3 个答案:

答案 0 :(得分:4)

不,python中的这个快捷方式不存在。

但也许这就是你所需要的:

>>> def test():
...     x = 42
...     y = 43
...     return locals()
>>> test()
{'y': 43, 'x': 42}

此外,python为这些事情提供了globals()vars()内置函数。 请参阅doc

答案 1 :(得分:3)

你试过vars()

吗?
  

<强>瓦尔([对象])
  返回具有__dict__属性的模块,类,实例或任何其他对象的__dict__属性。

     

模块和实例等对象具有可更新的__dict__   属性;但是,其他对象可能会对其进行写入限制   __dict__属性(例如,新式类使用dictproxy来防止直接字典更新)。

所以

variables = vars()
dictionary_of_bindings = {x:variables[x] for x in ("foo", "flip")}

答案 2 :(得分:3)

Python没有办法做到这一点,虽然它确实有localsglobals函数可以让你访问整个本地或全局命名空间。但是如果你想挑选出选定的变量,我认为最好使用inspect。这是一个应该为你做的功能:

def compact(*names):
    caller = inspect.stack()[1][0] # caller of compact()
    vars = {}
    for n in names:
        if n in caller.f_locals:
            vars[n] = caller.f_locals[n]
        elif n in caller.f_globals:
            vars[n] = caller.f_globals[n]
    return vars

确保检查它是否适用于您正在使用的任何Python环境。用法就是这样:

a = 1
b = 2
def func():
    c = 3
    d = 4
    compact('b', 'd')  # returns {'b': 2, 'd': 4}

但是,如果没有变量名称的引号,我认为没有办法逃脱。