Python:将字典中的变量加载到命名空间中

102 投票
8 回答
75646 浏览
提问于 2025-04-15 21:21

我想在一个函数外面使用一些在函数内部定义的局部变量。所以我在返回值中传递了 x=locals()

我该怎么做才能把那个字典里定义的所有变量加载到函数外的命名空间里,这样我就可以直接用 variable 来访问值,而不是用 x['variable']

8 个回答

23

在一个地方引入另一个地方的变量是完全可以的,只要你知道自己在做什么。我见过很多这样的代码,它们用得很不错。只要小心不要搞乱公共的全局空间就行。

你可以这样做:

adict = { 'x' : 'I am x', 'y' : ' I am y' }
locals().update(adict)
blah(x)
blah(y)
138

与其自己创建一个对象,不如使用 argparse.Namespace

from argparse import Namespace
ns = Namespace(**mydict)

如果想要做相反的操作:

mydict = vars(ns)
108

考虑一下 Bunch 这个替代方案:

class Bunch(object):
  def __init__(self, adict):
    self.__dict__.update(adict)

如果你有一个字典 d,想用 x.foo 这种方式来访问(读取)它的值,而不是用比较笨拙的 d['foo'],你只需要这样做:

x = Bunch(d)

这个方法在函数内部和外部都能用,而且比把 d 注入到 globals() 里要干净和安全得多!记住《Python之禅》里的最后一句话……:

>>> import this
The Zen of Python, by Tim Peters
   ...
Namespaces are one honking great idea -- let's do more of those!

撰写回答