2010-10-28 16 views
5

Eventuali duplicati:
What is the equivalent of the C# “using” block in IronPython?Python equivalente a C# s 'istruzione using

Sto scrivendo un po' di IronPython utilizzando alcuni oggetti usa e getta .NET, e si chiede se ci sia un bel "divinatorio" modo di farlo. Attualmente ho un mucchio di finally (e suppongo non ci dovrebbero essere i controlli per Nessuno in ciascuno di loro troppo - o sarà la variabile non esiste nemmeno se il costruttore fallisce?)

def Save(self): 
    filename = "record.txt" 
    data = "{0}:{1}".format(self.Level,self.Name) 
    isf = IsolatedStorageFile.GetUserStoreForApplication() 
    try:     
     isfs = IsolatedStorageFileStream(filename, FileMode.Create, isf) 
     try: 
      sw = StreamWriter(isfs) 
      try: 
       sw.Write(data) 
      finally: 
       sw.Dispose() 
     finally: 
      isfs.Dispose() 
    finally: 
     isf.Dispose() 

risposta

4

Python 2.6 ha introdotto la dichiarazione with , che prevede la pulizia automatica degli oggetti quando lasciano l'istruzione with. Non so se le librerie di IronPython lo supportano, ma sarebbe una scelta naturale.

domanda Dup con risposta autorevole: What is the equivalent of the C# "using" block in IronPython?

+0

grazie, che mi ha portato a questa domanda: http://stackoverflow.com/questions/1757296/what-is-the-equivalent-of-the-c- using-block-in-ironpython, che in qualche modo non ho trovato nelle mie ricerche precedenti –

0

Se ho capito bene, sembra che l'equivalente è la dichiarazione with. Se le tue classi definiscono i gestori di contesto, verranno chiamate automaticamente dopo il blocco con.

0

il codice con alcuni commenti:

def Save(self): 
    filename = "record.txt" 
    data = "{0}:{1}".format(self.Level,self.Name) 
    isf = IsolatedStorageFile.GetUserStoreForApplication() 
    try:     
     isfs = IsolatedStorageFileStream(filename, FileMode.Create, isf) 

     try: # These try is useless.... 
      sw = StreamWriter(isfs) 
      try: 
       sw.Write(data) 
      finally: 
       sw.Dispose() 
     finally: # Because next finally statement (isfs.Dispose) will be always executed 
      isfs.Dispose() 
    finally: 
     isf.Dispose() 

Per StreamWrite, è possibile utilizzare una con statment (se il vostro oggetto come __ entrare __ e _ uscita __ metodi) e poi il codice volontà assomiglia:

def Save(self): 
    filename = "record.txt" 
    data = "{0}:{1}".format(self.Level,self.Name) 
    isf = IsolatedStorageFile.GetUserStoreForApplication() 
    try:     
     isfs = IsolatedStorageFileStream(filename, FileMode.Create, isf) 
     with StreamWriter(isfs) as sw: 
      sw.Write(data) 
    finally: 
     isf.Dispose() 

e StreamWriter nel suo __ uscita __ metodo ha

sw.Dispose() 
+0

Puoi anche usare l'istruzione con la classe IsolatedStorageFile, se necessario. – ohe