在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'}
答案 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没有办法做到这一点,虽然它确实有locals
和globals
函数可以让你访问整个本地或全局命名空间。但是如果你想挑选出选定的变量,我认为最好使用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}
但是,如果没有变量名称的引号,我认为没有办法逃脱。