2010-10-28 26 views
5

Duplicar posibles:
What is the equivalent of the C# “using” block in IronPython?Python equivalente a usar la declaración de C# 's

estoy escribiendo algunos IronPython el uso de algunos objetos .NET desechables, y se preguntaba si hay un buen "Pythonic" forma de hacer esto. Actualmente tengo un montón de finally (y supongo que debe haber controles para Ninguno en cada uno de ellos también - o no quieren siquiera existe la variable si falla el constructor?)

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() 

Respuesta

4

Python 2.6 introdujo la declaración with , que permite la limpieza automática de los objetos cuando salen de la instrucción with. No sé si las bibliotecas de IronPython lo admiten, pero sería un ajuste natural.

pregunta Dup con respuesta autorizada: What is the equivalent of the C# "using" block in IronPython?

+0

gracias, que me llevó a esta pregunta: http://stackoverflow.com/questions/1757296/what-is-the-equivalent-of-the-c- using-block-in-ironpython, que de alguna manera no encontré en mis búsquedas anteriores –

0

Si he entendido bien, parece que el equivalente es la declaración with. Si sus clases definen los administradores de contexto, se llamarán automáticamente después del bloque con.

0

Su código con algunos comentarios:

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() 

Para streamwrite, se puede utilizar una con DECLARACIÓN (si su objeto como __ introducir __ y _ salida __ métodos), entonces su código voluntad se ve así:

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() 

y StreamWriter en su __ __ salida método tiene

sw.Dispose() 
+0

También puede usar la declaración con la clase IsolatedStorageFile, si es necesario. – ohe

Cuestiones relacionadas