Корректно ухудшающееся соление в Python

На всякий случай деньги не являются большим беспокойством, я имел большой успех с шаблонами в CodeSmith.

существует много демонстрационных шаблонов там для операций CRUD, и это будет читать непосредственно из Вашей базы данных.

6
задан Community 23 May 2017 в 12:19
поделиться

3 ответа

Как насчет следующего, который представляет собой оболочку, которую вы можете использовать для обертывания некоторых модулей (может быть, любого модуля) во что-то, что можно рассолить. Затем вы можете создать подкласс объекта Pickler, чтобы проверить, является ли целевой объект модулем, и, если да, обернуть его. Выполняет ли это то, что вы хотите?

class PickleableModuleWrapper(object):
    def __init__(self, module):
        # make a copy of the module's namespace in this instance
        self.__dict__ = dict(module.__dict__)
        # remove anything that's going to give us trouble during pickling
        self.remove_unpickleable_attributes()

    def remove_unpickleable_attributes(self):
        for name, value in self.__dict__.items():
            try:
                pickle.dumps(value)
            except Exception:
                del self.__dict__[name]

import pickle
p = pickle.dumps(PickleableModuleWrapper(pickle))
wrapped_mod = pickle.loads(p)
0
ответ дан 17 December 2019 в 18:18
поделиться

They do similar things, but strip allows finer grained control over what gets removed from the file.

Вызываемый объект должен быть зарегистрирован как «безопасный конструктор» или, что эквивалентно, иметь атрибут __ safe_for_unpickling __ с истинным значением. Эти элементы будут обработаны, и во время распаковки вызываемый объект будет вызываться с заданными аргументами и должен вернуть неотобранный объект.

Например, предположим, что вы хотите просто обработать модули по имени, так что распаковка их просто означает повторное -импорт их (т.е. для простоты предположим, что вас не интересуют динамически изменяемые модули, вложенные пакеты и т. д., только простые модули верхнего уровня). Затем:

>>> import sys, pickle, copy_reg
>>> def savemodule(module):
...   return __import__, (module.__name__,)
... 
>>> copy_reg.pickle(type(sys), savemodule)
>>> s = pickle.dumps(sys)
>>> s
"c__builtin__\n__import__\np0\n(S'sys'\np1\ntp2\nRp3\n."
>>> z = pickle.loads(s)
>>> z
<module 'sys' (built-in)>

Я использую старую форму ASCII pickle, чтобы s , строка, содержащая pickle, было легко исследовать: она инструктирует unpickling вызвать встроенную функцию импорта, со строкой sys в качестве единственного аргумента. И z показывает, что это действительно возвращает нам встроенный модуль sys в результате распаковки по желанию.

Теперь вам нужно что-то сделать. немного сложнее, чем просто __ import __ (вам придется иметь дело с сохранением и восстановлением динамических изменений, перемещаться по вложенному пространству имен и т. д.), и поэтому вам также придется вызвать copy_reg.constructor (передавая в качестве аргумента вашу собственную функцию, которая выполняет эту работу) перед copy_reg функцией сохранения модуля, которая возвращает другую вашу функцию (и, если в отдельном прогоне, также перед тем, как распаковать эти соленья, вы сделано с использованием указанной функции). Но я надеюсь, что эти простые случаи помогут показать, что на самом деле в этом нет ничего "внутреннего" сложного! -)

вам придется сделать вещи немного сложнее, чем просто __ import __ (вам придется иметь дело с сохранением и восстановлением динамических изменений, перемещаться по вложенному пространству имен и т. д.), и, следовательно, вам также придется вызовите copy_reg.constructor (передавая в качестве аргумента вашу собственную функцию, которая выполняет эту работу) перед тем, как copy_reg функцию сохранения модуля, которая возвращает вашу другую функцию (и, если в отдельном запуске, также перед тем, как разобрать огурцы, приготовленные с помощью указанной функции). Но я надеюсь, что эти простые случаи помогут показать, что на самом деле в этом нет ничего "внутреннего" сложного! -)

вам придется сделать вещи немного сложнее, чем просто __ import __ (вам придется иметь дело с сохранением и восстановлением динамических изменений, перемещаться по вложенному пространству имен и т. д.), и, следовательно, вам также придется вызовите copy_reg.constructor (передавая в качестве аргумента вашу собственную функцию, которая выполняет эту работу) перед тем, как copy_reg функцию сохранения модуля, которая возвращает вашу другую функцию (и, если в отдельном запуске, также перед тем, как вы откроете те соленья, которые вы сделали с помощью указанной функции). Но я надеюсь, что эти простые случаи помогут показать, что на самом деле в этом нет ничего "внутреннего" сложного! -)

перемещаться по вложенному пространству имен и т. д.), и поэтому вам также придется вызвать copy_reg.constructor (передавая в качестве аргумента вашу собственную функцию, которая выполняет эту работу), прежде чем вы copy_reg модуль- функция сохранения, которая возвращает вашу другую функцию (и, если в отдельном прогоне, также перед тем, как вы извлечете те соленья, которые вы сделали с помощью указанной функции). Но я надеюсь, что эти простые случаи помогут показать, что на самом деле в этом нет ничего "внутреннего" сложного! -)

перемещаться по вложенному пространству имен и т. д.), и поэтому вам также придется вызвать copy_reg.constructor (передавая в качестве аргумента вашу собственную функцию, которая выполняет эту работу), прежде чем вы copy_reg модуль- функция сохранения, которая возвращает вашу другую функцию (и, если в отдельном прогоне, также перед тем, как вы извлечете те соленья, которые вы сделали с помощью указанной функции). Но я надеюсь, что эти простые случаи помогут показать, что на самом деле в этом нет ничего "внутреннего" сложного! -)

также перед тем, как разобрать огурцы, приготовленные с помощью указанной функции). Но я надеюсь, что эти простые случаи помогут показать, что на самом деле в этом нет ничего "внутреннего" сложного! -)

также перед тем, как разобрать огурцы, приготовленные с помощью указанной функции). Но я надеюсь, что эти простые случаи помогут показать, что на самом деле в этом нет ничего "внутреннего" сложного! -)

3
ответ дан 17 December 2019 в 18:18
поделиться

Хммм, что-то вроде этого?

import sys

attribList = dir(someobject)
for attrib in attribList:
    if(type(attrib) == type(sys)): #is a module
        #put in a facade, either recursively list the module and do the same thing, or just put in something like str('modulename_module')
    else:
        #proceed with normal pickle

Очевидно, это войдет в расширение класса pickle с повторно реализованным методом дампа ...

0
ответ дан 17 December 2019 в 18:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: