Python'da turşu için yaygın kullanım durumları


134

Turşu belgelerine baktım , ama turşunun nerede yararlı olduğunu anlamıyorum.

Turşu için bazı yaygın kullanım durumları nelerdir?


2
Asitleme ile ilgili anlamadığım kısım, değeri neden sadece bir dosyaya kaydetmiyorsunuz? Neden turşu?
whackamadoodle3000

Yanıtlar:


59

Karşılaştığım bazı kullanımlar:

1) bir programın durum verilerini diske kaydedilir, böylece yeniden başlatıldığında kaldığı yerden devam edebilir (kalıcılık)

2) çok çekirdekli veya dağıtılmış bir sistemdeki bir TCP bağlantısı üzerinden python verisi gönderme (sıralama)

3) Python nesnelerini bir veritabanında saklamak

4) isteğe bağlı bir python nesnesini bir sözlük anahtarı olarak kullanılabilmesi için bir dizeye dönüştürmek (örn. Önbellekleme ve notlama için).

Sonuncusu ile ilgili bazı sorunlar var - iki özdeş nesne turşabilir ve farklı dizelerle sonuçlanabilir - veya iki kez turşusu yapılan aynı nesne bile farklı temsillere sahip olabilir. Bunun nedeni, turşunun referans sayısı bilgisini içermesidir.

@ Lunaryorn'un yorumunu vurgulamak için - özenle hazırlanmış bir turşu sisteminizde rasgele kod yürütebileceğinden, asla bir dizeyi güvenilmeyen bir kaynaktan seçmemelisiniz. Örneğin, bkz. Https://blog.nelhage.com/2011/03/exploiting-pickle/


27
Turşu verileri manipülasyona karşı dikkatlice korunmadıkça, turşu nesneleri ağ veya diğer güvenilmeyen kanallar üzerinden aktarmamalısınız. Turşu belgeleri açıkça , güvenilmeyen veya kimliği doğrulanmamış kaynaklardan gelen verilerin hiçbir zaman seçilmeyeceği konusunda uyarır .
lunaryorn

4
@ lunaryorn: iyi bir nokta. Turşu verilerini makineler arasında aktaracaksanız, SSL veya SSH tüneli gibi güvenli bir kanal kullanın.
Dave Kirby

3
O zaman hala bağlama bağlı olarak, sizi istismar etmeyecek uç noktaya güveniyorsunuz.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

@lunaryorn - iyi bir nokta, ancak bu durumda kamusal alanda verileri nasıl şifreleyebiliriz. başka bir py lib kullanmalı mıyız yoksa turşu kullanmamalı mıyız?
Pardeep Sharma

Madde 4) doğru mu? Burada işe yaramayacak bazı (eski) kanıtlara sahip olanı buldum .
salotz

10

Minimum gidiş dönüş örneği ..

>>> import pickle
>>> a = Anon()
>>> a.foo = 'bar'
>>> pickled = pickle.dumps(a)
>>> unpickled = pickle.loads(pickled)
>>> unpickled.foo
'bar'

Düzenleme: ama turşu gerçek dünya örnekleri sorusuna gelince, belki de en gelişmiş turşu kullanımı (kaynağa oldukça derin kazmak zorunda kalacaksınız) ZODB: http://svn.zope.org/

Aksi takdirde, PyPI birkaç kişiden bahseder: http://pypi.python.org/pypi?:action=search&term=pickle&submit=search

Kişisel olarak, ağ üzerinden kullanımı kolay bir ağ aktarım protokolü olarak gönderilen turşu nesnelerin birkaç örneğini gördüm.


8

Dağıtılmış ve paralel hesaplama için dekapaj kesinlikle gereklidir.

Diyelim ki multiprocessing(veya pyina ile küme düğümleri arasında ) paralel bir harita azaltma yapmak istediğinizi varsa, paralel kaynaklar arasında eşlemek istediğiniz işlevin turşu olacağından emin olmanız gerekir. Turşu olmazsa, başka bir işlem, bilgisayar vb. Diğer kaynaklara gönderemezsiniz. Ayrıca iyi bir örnek için buraya bakın .

Bunu yapmak için , python'da neredeyse her şeyi serileştirebilen dereotu kullanıyorum . Dill ayrıca, kodunuz başarısız olduğunda dekapajınızın neyin başarısız olduğunu anlamanıza yardımcı olacak bazı iyi araçlara sahiptir .

Ve evet, insanlar bir hesaplamanın durumunu veya ipython oturumunuzu ya da her neyse kaydetmek için toplama özelliğini kullanır .


7

Projelerimden birinde kullandım. Uygulama çalışırken sona erdirildiyse (uzun bir görev yaptı ve çok sayıda veri işledi), tüm veri yapısını kaydetmem ve uygulama tekrar çalıştırıldıktan sonra yeniden yüklemem gerekiyordu. Bunun için cPickle kullandım, çünkü hız çok önemli bir şeydi ve veri boyutu gerçekten büyüktü.


4

Turşu, veri yapılarınız ve sınıflarınız için "Farklı Kaydet .." ve "Aç .." gibi. Diyelim ki veri yapılarımı program çalışmaları arasında kalıcı olacak şekilde kaydetmek istiyorum.

kaydetme:

with open("save.p", "wb") as f:    
    pickle.dump(myStuff, f)        

Yükleniyor:

try:
    with open("save.p", "rb") as f:
        myStuff = pickle.load(f)
except:
    myStuff = defaultdict(dict)

Şimdi myStuff'ı tekrar sıfırdan oluşturmak zorunda değilim ve bıraktığım yerden (le) alabilirim.


3

Yeni başlayanlar için (bende olduğu gibi) resmi belgeleri okurken neden ilk etapta turşu kullanıldığını anlamak gerçekten zor . Belki de bu dokümanlar serileştirmenin tüm amacını zaten bildiğinizi ima ediyor. Sadece serileştirmenin genel tanımını okuduktan sonra bu modülün nedenini ve ortak kullanım durumlarını anladım. Ayrıca belirli bir programlama dilini göz ardı ederek serileştirmenin geniş açıklamaları yardımcı olabilir: https://stackoverflow.com/a/14482962/4383472 , Serileştirme nedir? , https://stackoverflow.com/a/3984483/4383472


"cevabınız" bir cevap değil, daha çok bir yorumdur. OP'nin sorusu "Turşu için bazı yaygın kullanım durumları nelerdir?" Sorusudur. Bu soruyu herhangi bir şekilde cevapladığınızı düşünüyor musunuz?
Mike McKerns

3
soruyu cevapladığımı hissediyorum, çünkü burada , burada ve burada bu modül hakkında okumaya çalıştığımda turşu yaygın kullanımlarını anlamakta zorlandım . Çünkü çoğunlukla, tüm serileştirme kavramının arkasındaki motivasyonu bildiğinizi varsayarak turşunun ne yaptığını açıklamaya başlarlar. Serileştirme ile ilgili basit wiki makalesini okuduktan sonra genel fikri ve "ortak vakaları" kavradım. Belki birine yardım eder ...
Kötü

ve bu yaygın vakalardan bazıları…? Burada başka yanıtlarda listelenmeyen bazı varsa… bunları yanıtınıza eklemek çok uygun olacaktır.
Mike McKerns

2

Gerçek dünyadan bir örnek eklemek için: Python için Sphinx belge aracı, belgelerin sonraki yapılarını hızlandırmak için ayrıştırılmış belgeleri ve belgeler arasında çapraz referansları önbelleğe almak için turşu kullanır.


1

Bunun için kullandığım kullanımları söyleyebilirim ve bunun için kullanıldığını gördüm:

  • Oyun profili tasarrufları
  • Oyun verileri hayat ve sağlık gibi tasarruf sağlar
  • Bir programa girilen sözlü sayıların önceki kayıtları

En azından benim kullandığım bunlar


1

Ben web sitesi bir web hurdaya sırasında dekapaj kullanıyorum o zaman 8000k url fazla saklamak istiyorum ve mümkün olduğunca hızlı işlemek istiyorum, böylece çıktı kalitesi çok yüksek olduğu için dekapaj kullanın.

kolayca url ulaşabilirsiniz ve hatta nerede iş dizini anahtar kelime durdurmak da url ayrıntılarını süreci devam etmek için çok hızlı getir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.