gpt4 book ai didi

python - 在 Python 中轻松地从/到 namespace /字典转储变量

转载 作者:太空狗 更新时间:2023-10-29 20:11:22 26 4
gpt4 key购买 nike

假设我在 Python 中有几个变量或对象,a, b, c, ...

我如何轻松地将这些变量转储到 Python 中的命名空间中并在以后恢复它们? (例如,以相同的方式 argparse 将各种变量包装到命名空间中)。

这里有两个例子,说明我想如何将东西转储到 namespace 和从 namespace 转储:

将局部变量转储到命名空间

function (bar):
# We start with a, b and c
a = 10
b = 20
c = "hello world"

# We can dump anything we want into e, by just passing things as arguments:
e = dump_into_namespace(a, b, c)
del a, b, c

print (e.a + e.b) # Prints 30
return e # We can return e if we want. This is just a use case scenario

从命名空间 e 中转储局部变量

# We start with e, which for example was built with a call to 
# dump_into_namespace(a,b,c) somewhere else in the program,
# in which case e would hold a, b and c

# We may receive e through a function call or load it from disk, e.g.:

function foo(e):

# The following call creates the variables a,b and c
# or updates their values if the already exist in memory
dump_from_namespace(e)
del e

print(a + b) # Prints 30
print(c) # Prints hello world

我的第一个问题是:这在 Python 中完全可行吗?(请注意方法 dump_into_namespace 不直接接收变量的名称,至少到目前为止据我所知)。

如果上面的答案是否定的,我怎么能用这样的界面来做呢?

e = dump_into_namespace('a', 'b', 'c')

此外,如果使用字典而不是命名空间,如何做到这一点?

有一些线程似乎与解决动态定义变量的点访问相关,但我认为它们没有解决转储变量的问题:

另见

是否有任何库可以通过点符号来促进这种类型的访问?

更新:

看起来有一个库支持 Python 中的点访问字典,称为 Bunch ,但我不确定它是否支持我定义的轻松转储。

最佳答案

下面的解决方案提供的语法非常接近您的要求,唯一的区别是您必须传递到显式定义变量的函数环境:

x = 10
y = 20

class dump_into_namespace:
def __init__(self, env, *vars):
self.vars = dict([(x, env[x]) for v in vars for x in env if v is env[x]])
def __getattr__(self, name): return self.vars[name]

o = dump_into_namespace(locals(), x, y)
print o.x, o.y

然后您可以将变量“转储”回本地(例如,在不同的函数中):

>>> locals().update(o.vars)
>>> x
10

编辑:

感谢 eyquem 的建议,这可以更短。这个想法是将变量放入“转储”对象的 self.__dict__ 中(注意:此处更新语法更改):

class dump_into_namespace:
def __init__(self, env, *vs):
vars(self).update(dict([(x, env[x]) for v in vs for x in env if v is env[x]]))

def f():
x = 10
y = 20
return dump_into_namespace(locals(), x, y)

o = f()
print o.x, o.y
globals().update(vars(o))
print x

关于python - 在 Python 中轻松地从/到 namespace /字典转储变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14903576/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com