2014-11-10 9 views

cevap

16

Sen takip edebilirsiniz EAFP principle ve ask for forgiveness:

import pickle 

try: 
    foo = pickle.load(open("var.pickle", "rb")) 
except (OSError, IOError) as e: 
    foo = 3 
    pickle.dump(foo, open("var.pickle", "wb")) 
6

Ben kullanırlılık bir fonksiyonu içine koyun daha az verimlidir olarak, dosya üzerinde kontrol akışı için alıcı hatayı önlemek ve ben ediyorum dosyayı açmak için içerik yöneticilerini kullanır.

import os 
import pickle 

def read_or_new_pickle(path, default): 
    if os.path.isfile(path): 
     with open(path, "rb") as f: 
      try: 
       return pickle.load(f) 
      except StandardError: # so many things could go wrong, can't be more specific. 
       pass 
    with open(path, "wb") as f: 
     pickle.dump(default, f) 
    return default 

kullanımı:

foo = read_or_new_pickle(path="var.pickle", default=3) 

foo döner

foo = read_or_new_pickle(path="var.pickle", default=4) 

3 ve foo hala 3 döndürür.

Kuşkusuz, şu oldukça kısa ve zarif, ama çok şeyler yanlış gidebilir ve yakalamak zorundayız herşey (Bana inanmıyorsanız bu deneyin:? import io, pickle; pickle.load(io.BytesIO(b"\x00")) ve ikili oynamak):

Aynı kullanım. Ancak, dosyanın boş veya hatalı biçimlendirilmiş bir dosyada ikinci kez açılmasıyla ilgili bir hatayı önlemek için yeterince hızlı kapatılmayacağı endişesiyle endişeliyim. Bu nedenle içerik yöneticisini kullanın: