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

dzh*_*lil 59 python variables scope locals

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

如何将该字典中定义的所有变量加载到函数外部的命名空间中,这样x['variable']我就可以简单地使用,而不是使用值来访问该值variable.

Ale*_*lli 88

考虑Bunch替代方案:

class Bunch(object):
  def __init__(self, adict):
    self.__dict__.update(adict)
Run Code Online (Sandbox Code Playgroud)

因此,如果您有一个字典d并想要使用语法x.foo而不是笨拙地访问(读取)其值,那么d['foo']就这样做

x = Bunch(d)
Run Code Online (Sandbox Code Playgroud)

这个作品内外的功能-它极大地比注入更清洁和更安全的d进入globals()!记住Python的Zen的最后一行......:

>>> import this
The Zen of Python, by Tim Peters
   ...
Namespaces are one honking great idea -- let's do more of those!
Run Code Online (Sandbox Code Playgroud)

  • 但这看起来很优雅:`globals().update(locals())`!(我小孩,我小时候) (13认同)
  • 另请参阅/sf/answers/1984208551/和types.SimpleNamespace. (2认同)

oro*_*hen 20

您可以使用argparse.Namespace以下命令,而不是创建自己的对象:

from argparse import Namespace
ns = Namespace(**mydict)
Run Code Online (Sandbox Code Playgroud)

做反过来:

mydict = vars(ns)
Run Code Online (Sandbox Code Playgroud)

  • 最后,一些安全、可读并且已经在标准库中实现的东西。不过,我想知道为什么这个“好主意”驻留在“argparse”模块中。 (5认同)
  • 现在可以作为“types.SimpleNamespace”使用 (4认同)
  • 在“逆”部分有一个微妙的警告:当执行“mydict = vars(ns)”时,新字典和原始命名空间都将指向同一个对象(更改其中一个也会更改另一个)。执行 `mydict = vars(ns).copy()` 以避免这种情况。 (4认同)

Tha*_*ava 17

这是将一个局部空间中的变量导入另一个局部空间的完全有效的情况,只要知道他/她正在做什么.我已经看到这样的代码多次以有用的方式使用.只需注意不要污染共同的全球空间.

您可以执行以下操作:

adict = { 'x' : 'I am x', 'y' : ' I am y' }
locals().update(adict)
blah(x)
blah(y)
Run Code Online (Sandbox Code Playgroud)

  • [文档明确警告不要更新 `locals()` 的返回值](https://docs.python.org/3/library/functions.html#locals)。 (6认同)
  • 有什么问题:`from argparse import Namespace; ns = 命名空间(**mydict)` ? (2认同)

Rad*_*dek 7

将变量导入本地名称空间是一个有效的问题,通常用于模板框架.

从函数返回所有局部变量:

return locals()
Run Code Online (Sandbox Code Playgroud)

然后导入如下:

r = fce()
for key in r.keys():
   exec(key + " = r['" + key + "']")
Run Code Online (Sandbox Code Playgroud)

  • 工作完美,但速度很慢......虽然简单的测试程序不是问题. (2认同)