Python:在函数的本地命名空间中包含字典的条目

For*_*zaa 2 python dictionary namespaces function local

这可能是之前被问过的,但是快速搜索并没有给我答案.

假设有一个包含所有变量的字典.如何将此字典传递给函数的本地命名空间?例如:

data = dict(a=1,b=2,c=3,d=4)
def f(data):
    return data['a'] + data['d']
Run Code Online (Sandbox Code Playgroud)

需要在您想要访问的每个变量周围写入数据[''].如何将字典的所有条目添加到函数的本地命名空间?对于您可以使用的对象

self.__dict__.update(data)
Run Code Online (Sandbox Code Playgroud)

是否存在与函数等效的东西,以便您获得以下内容:

data = dict(a=1,b=2,c=3,d=4)
def f(data):
    add_to_local_namespace(data)
    return a + d
Run Code Online (Sandbox Code Playgroud)

wim*_*wim 5

在一般情况下,这是不可能的,因为dict可以具有不是有效变量名的键,例如Python 关键字或非字符串.

如果您迫切需要这个,并且可以保证dict键都是有效的变量名,并且您不需要它在Python 3上工作,则可以循环遍历dict项并使用exec语句.这种方法有一些奇怪的范围后果,它非常难看,应该强烈劝阻.

可接受的替代方法是创建一个虚拟对象并将它们设置为属性,例如:

>>> data = dict(a=1,b=2,c=3,d=4)
>>> from types import SimpleNamespace
>>> v = SimpleNamespace(**data)
>>> v.a
1
>>> v.d
4
Run Code Online (Sandbox Code Playgroud)

但它只是dict访问的语法糖. 阅读Python#19的zen.无论你如何看待它,你都需要命名空间!

另一个想法:创建一个可调用的类而不是一个函数(通过继承collections.Callable),并将dict解压缩到类的属性中.那么至少你的变量将由类命名.