我需要分配一个模块&类到字典键。然后挑选那个字典来存档。然后,加载pkl文件,然后导入&根据该字典键值实例化该类。
我试过这个:
import module_example
from module_example import ClassExample
dictionary = {'module': module_example, 'class': ClassExample)
然而,它不会在pkl文件中存储对module_exmaple.py的引用。
我尝试过使用字符串代替模块&班级名称。但如果模块名称被重构或位置在路上发生变化,那将导致混乱。
无论如何直接这样做吗?以某种方式存储对模块的引用&在字典中的类,然后导入&基于该引用实例化?
答案 0 :(得分:2)
这适用于单班。如果要在多个模块和类中执行此操作,可以扩展以下代码。
<强> module_class_writer.py 强>
import module_example
from module_example import ClassExample
included_module = ["module_example"]
d = {}
for name, val in globals().items():
if name in included_module:
if "__module__" in dir(val):
d["module"] = val.__module__
d["class"] = name
#d = {'module': module_example, 'class': ClassExample}
import pickle
filehandler = open("imports.pkl","wb")
pickle.dump(d, filehandler)
filehandler.close()
<强> module_class_reader.py 强>
import pickle
filehandler = open("imports.pkl",'rb')
d = pickle.load(filehandler)
filehandler.close()
def reload_class(module_name, class_name):
mod = __import__(module_name, fromlist=[class_name])
reload(mod)
return getattr(mod, class_name)
if "class" in d and "module" in d:
reload(__import__(d["module"]))
ClassExample = reload_class(d["module"], d["class"])
答案 1 :(得分:0)
如果您希望unpickled类与被腌制的完全相同的对象,您必须存储类的代码(例如,使用外部库,如dill)。
否则,标准泡菜无法存储对将会生存的类的引用。重构。