我想编写一个函数来腌制当前命名空间中的所有对象,这些对象是给定模块中类的实例。这个想法是,在 ipython 会话期间,用户从 中创建许多对象mymodule
,并且可能需要快速保存所有对象。
所以,例如我想要这样的东西
from mymodule import cat, dog, pickle_all
c= cat(), d=dog()
pickle_all('killer_sesh.p')
结束会话,忘记一个月,回来开始新的会话,
from mymodule import upickle_all
objs = unpickle_all('killer_sesh.p')
所以我的第一次尝试(如下所示)在粘贴到当前命名空间时有效。如果我定义为一个函数,或者把它放在其他地方,比如在 mymodule 中,那么该dir()
命令不会返回当前命名空间,而是返回函数看到的命名空间。即使我将 dir() 的结果作为参数传递,对象在函数中也不可用。
import pickle
filename= 'killer_sesh.p'
module='mymodule'
module_objects = {}
for k in dir():
try:
if eval(k).__module__.split('.')[0] == module:
if k[0]!='_':
print(k)
module_objects[k] = eval(k)
except(AttributeError):
pass
file= open(filename,'w')
pickle.dump(module_objects, file)
file.close()
这样的功能可能吗?