У меня есть система, которая обычно хранит маринованные типы классов.
Я хочу иметь возможность сохранять динамически параметризованные классы таким же образом, но я не могу, потому что получаю PicklingError при попытке рассортировать класс, который не найден глобально (не определен в простом коде).
Моя проблема может быть смоделирована как следующий пример кода:
class Base(object):
def m(self):
return self.__class__.PARAM
def make_parameterized(param_value):
class AutoSubClass(Base):
PARAM = param_value
return AutoSubClass
cls = make_parameterized(input("param value?"))
Когда я пытаюсь разбор класса, я получаю следующую ошибку:
# pickle.PicklingError: Can't pickle <class '__main__.AutoSubClass'>: it not found as __main__.AutoSubClass
import pickle
print pickle.dumps(cls)
Я ищу некоторый метод для объявления Base как ParameterizableBaseClass
, который должен определить необходимые параметры (PARAM
в приведенном выше примере). Затем динамический параметризованный подкласс (cls
выше) должен быть подбираем, сохраняя тип "ParameterizableBaseClass" и различные значения параметров (динамический param_value
выше).
Я уверен, что во многих случаях этого можно избежать вообще... И я могу избежать этого и в своем коде, если я действительно (действительно) должен. Я играл с __metaclass__
, copyreg
и даже __builtin__.issubclass
в какой-то момент (не спрашиваю), но не смог взломать этот.
Я чувствую, что не верю в дух питона, если не буду спрашивать: как это может быть достигнуто относительно чистым способом?