То, что вы делаете, - плохая идея, в основном потому, что вы допускаете слишком большую изменчивость в том, какой код будет выполняться. Строка кода может сделать что угодно , и я предполагаю, что есть только несколько видов задач, которые вы хотите сохранить для последующего выполнения.
Итак, выясните, каковы переменные в этих задачах (переменные в непрограммическом смысле: разные вещи) и сохраните только эти переменные, возможно, в виде набора аргументов функции и словаря аргументов ключевых слов, которые нужно применить к известной функции.
Чтобы быть еще более необычным, у вас может быть какой-то контейнерный объект с кучей функций на нем, и сохраните имя вызываемой функции вместе с ее аргументами. Этот контейнер может быть чем-то таким простым, как модуль, в который вы импортируете функции, такие как send_mail
в Django, как в вашем примере.
Тогда вы можете сохранить ваш пример вызова следующим образом:
func = 'send_mail'
args = ('subj', 'body', 'email@box.ru', ['email1@box.ru'])
kwargs = {'fail_silently': False}
my_call = cPickle.dumps((func, args, kwargs))
И используйте это так:
func, args, kwargs = cPickle.loads(my_call)
getattr(my_module, func)(*args, **kwargs)