Python укусит динамический объект класса внутри модуля и прочитает его в новом сеансе python

Скажем, у меня есть 2 субмодуля внутри пакета, так как

|-packageA
   |- moduleA
   |- moduleB

moduleB имеет метод создания динамического класса, который использует type () для создания нового класса.

def moduleB.fun():
   new_cls = type("bar",(obejct,),{})
   return new_cls

Созданный класс всегда имеет имя packageA.moduleB.bar. (Вместо этого мне нужно, чтобы это было просто bar.)

Когда я укрою объект, созданный из этого динамического класса, он выгружает его вместе с именем пространства имен.

def moduleA.fun2():
  new_cls = moduleB.fun()
  obj = new_cls("Object of new class")
  dill.dump(obj, open("test.obj","wb"))

Проблема возникает, когда я нахожусь в новом сеансе python и пытаюсь загрузить этот файл укропа.

В новой сессии,

dat = dill.load(open("test.obj","rb"))

Укроп жалуется, что Can't get attribute 'bar' on <module 'packageA.moduleB'>

Я попытался установить его global()["bar"] = new_clsв moduleB.fun (), но это создание типа, которое кажется проблемой. Любая помощь?

python,python-3.x,pickle,metaclass,dill,

0

Ответов: 1


0

Хорошо - похоже, что укроп имеет 2 класса поведения маринования - в одном из них он пытается привязать класс к его объявлению в исходном модуле, а с другой, он переключается на видимый create_typeоперанд внутри самой колодки Pickle.

Я мог бы переключиться на второй модуль, перезаписав __module__атрибут класса "__main__"перед травлением - давайте попробуем:

def moduleA.fun2():
  new_cls = moduleB.fun()
  new_cls.__module__ = "__main__"
  new_cls.__qualname__ = new_cls.__name__.split(".")[-1]
  obj = new_cls("Object of new class")
  dill.dump(obj, open("test.obj","wb"))
питон, питон-3.x, рассол, метакласс, укроп,
Похожие вопросы