2014-11-10 18 views

Antwort

16

können Sie folgen dem EAFP principle und 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

ich es in einer Funktion zur Wiederverwertbarkeit setzen würde, vermeiden Fehler in der Datei für die Ablaufsteuerung zu kontrollieren, da es weniger effizient ist, und ich würde Kontext-Manager verwenden, um die Datei zu öffnen.

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 

Nutzung:

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

foo kehrt 3

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

und foo noch gibt 3.

Zugegeben, das folgende ist ziemlich kurz und elegant, aber zu viele Dinge schief gehen könnte, und Sie würden fangen müssen alles (glauben mir nicht versuchen, diese:? import io, pickle; pickle.load(io.BytesIO(b"\x00")) und mit dem binären spielen):

import pickle 

def read_or_new_pickle(path, default): 
    try: 
     foo = pickle.load(open(path, "rb")) 
    except StandardError: 
     foo = default 
     pickle.dump(foo, open(path, "wb")) 
    return foo 

Gleiche Verwendung. Aber ich bin besorgt, dass die Datei möglicherweise nicht schnell genug geschlossen wird, um einen Fehler beim zweiten Öffnen im Falle einer leeren oder fehlerhaften Datei zu vermeiden. Verwenden Sie also den Kontextmanager:

import pickle 

def read_or_new_pickle(path, default): 
    try: 
     with open(path, "rb") as f: 
      foo = pickle.load(f) 
    except StandardError: 
     foo = default 
     with open(path, "wb") as f: 
      pickle.dump(foo, f) 
    return foo 
Verwandte Themen