Кажется, что следующий хак работает в Python 3.1 ...:
import copyreg
def functionpickler(f):
print('pickling', f.__name__)
return f.__name__
ft = type(functionpickler)
copyreg.pickle(ft, functionpickler)
import pickle
pickle.Pickler = pickle._Pickler
del pickle.Pickler.dispatch[ft]
s = pickle.dumps(functionpickler)
print('Result is', s)
Из этого две хакерские строки:
pickle.Pickler = pickle._Pickler
del pickle.Pickler.dispatch[ft]
Вам необходимо удалить запись dispatch
для типа функций, потому что в противном случае она прерывает регистрацию copyreg; и я не думаю, что вы можете сделать это на C-кодированном Pickler, поэтому вам нужно установить его на Python-кодированный.
Было бы немного проще взломать подкласс _Pickler
с вашим собственным классом, который создает свой собственный dispatch
(копирование родительского элемента и удаление записи для типа функции), а затем специально использовать ваш подкласс (и его метод дампа), а не pickle.dump
; однако было бы немного менее удобно, если бы эта маринованная маринада сама по себе мариновала.