6

在 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'}
4

3 回答 3

4

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

但也许这就是你需要的:

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

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

于 2012-10-08T06:34:04.867 回答
3

你有没有尝试过vars()

vars([object])
返回__dict__模块、类、实例或任何其他具有属性的对象的__dict__属性。

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

所以

variables = vars()
dictionary_of_bindings = {x:variables[x] for x in ("foo", "flip")}
于 2012-10-08T06:36:35.343 回答
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}

不过,我认为没有任何方法可以摆脱变量名周围的引号。

于 2012-10-08T06:37:05.717 回答