2009-10-04 9 views
3

Je modifier le code Python qui ont cette forme:prises de fermeture en python

def foo(self): 
    try: 
     connect socket 
    except Exception, e: 
     some error reporting stuff 
     return an error 

    use the socket 
    do some other stuff 

    if some condition: 
     return 

    do some more stuff 
    socket.close() 
    return normally 

venant de Java Je voudrais avoir un essai - enfin autour de la chose pour vous assurer que la prise est fermée. Est-ce que ce code devrait aussi avoir ceci ou est-ce une sorte de magie Pythonique qui se passe en arrière-plan qui fait en sorte que vous n'ayez pas à le faire?

J'ai lu dans les documents python que les sockets sont fermés lorsqu'ils sont collectés. Mais compter sur le garbage collector pour fermer vos douilles ne se sent pas si bien.

Répondre

11

Vous pouvez utiliser un bloc try-finally, qui a été ajouté en Python 2.5:

try: 
    open socket 
    do stuff with socket 
finally: 
    close socket 

Ou vous pouvez utiliser l'instruction with, qui a été ajouté en Python 2.6 (et peut être utilisé dans 2,5 avec une déclaration from __future__ import with_statement):

with open_the_socket() as s: 
    use s 

Ceci ferme automatiquement la prise de courant lorsque le bloc interne est sorti, que ce soit terminé normalement ou par l'intermédiaire d'une exception, à condition que la classe de prise ferme dans sa méthode __exit__().

À partir de Python 2.7.2, la méthode __exit__() n'est pas implémentée sur la classe socket.

+3

Python a toujours essayé. 2.5 unified try-except-finally http://docs.python.org/reference/compound_stmts.html#the-try-statement – JimB

1

Vous semblez manquer le bloc finally ajouté à essayer/sauf dans 2,5

http://docs.python.org/whatsnew/2.5.html#pep-341-unified-try-except-finally

Vous avez raison que compter sur la autoclose lorsque les déchets collectés est une mauvaise pratique, il est préférable de les fermer quand vous avez fini avec eux. Un essai/enfin est un bon moyen de le faire. N'oubliez pas d'appeler shutdown() avant de fermer().

Questions connexes