Python укрупняет динамический объект класса внутри модуля и читает его в новой сессии Python - PullRequest
0 голосов
/ 25 июня 2018

Скажем, у меня есть 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 (), но это создание типа, которое кажется проблемой.Любая помощь?

1 Ответ

0 голосов
/ 08 июля 2018

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

Я мог бы переключиться на второй модуль, переписав атрибут класса '__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"))
...