2010-05-28 11 views
5

(Öyle bir çözüm Python 3'te çalışması gerekiyor, Python 3 çalışıyorum unutmayın) sahip türleri için düşürücüler tanımlamak için copyreg` kullanmaPython: `Zaten düşürücüler

ı kullanmak istiyorum

copyreg modülünde, Python'un nasıl çalıştırılacağı öğretilir. Bunu yapmaya çalıştığımda, _Pickler nesnesi hala save_global işlevini kullanarak işlevleri açmaya çalışır. (Bağlanmamış yöntemleri için çalışmak ve bu iş için motivasyon gelmez hangisi.)

Size copyreg.dispatch_table bakarak önce turşu istediğiniz nesne türü için dispatch kendi bakmak için _Pickler ilk deneme gibi görünüyor . Bunun kasıtlı olup olmadığından emin değilim.

Python'a sağladığım redüktörle fonksiyonları toplamalarını söylemenin bir yolu var mı? Aşağıdaki kesmek Python 3.1 çalışmak gibi görünüyor

cevap

1

...: Bunun dışında

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) 

, iki hackish hatları şunlardır:

pickle.Pickler = pickle._Pickler 
del pickle.Pickler.dispatch[ft] 

Sen işlevleri için dispatch girişi kaldırmak gerekir 'türü, aksi halde copyreg kaydını önler; ve bunu C-kodlu Pickler'da yapabileceğinizi düşünmüyorum, bu yüzden Python-kodlu olana ayarlamanız gerekiyor.

O yapar kendi bir sınıf ile _Pickler alt sınıfı için bir hack biraz daha az olurdu onun kendi dispatch ve sonra özel olarak alt sınıfı kullanmak (ve (Ebeveyn ile fonksiyon türü için giriş çıkarmadan kopyalama) onun pickle.dump yerine çöplük yöntemi); bununla birlikte, bu turşunun kendisi için bu maymunu da biraz daha uygun olacaktır.

+0

Güzel kesmek. Ama ben gerçekten "_pickle" in C hızından zevk almak istiyorum ... –