Comments on: Les context managers et le mot clé with en Python http://sametmax.com/les-context-managers-et-le-mot-cle-with-en-python/ Du code, du cul Sat, 07 Nov 2015 11:08:18 +0000 hourly 1 http://wordpress.org/?v=4.1 By: Sébastien http://sametmax.com/les-context-managers-et-le-mot-cle-with-en-python/#comment-160135 Sat, 02 May 2015 13:17:09 +0000 http://sametmax.com/?p=1987#comment-160135 Je cherchais à générer un fichier XML. L’idée d’utiliser la notion de context manager me trottait. En Googlant un peu j’ai trouvé cette excellente bibliothèque qui mérite d’être connue : http://www.yattag.org/ https://github.com/leforestier/yattag

 
from yattag import Doc, indent
 
doc, tag, text = Doc().tagtext()
 
with tag('persons'):
    with tag('person', id = '0'):
        with tag('name'):
            text('Pierre')
    with tag('person', id = '1'):
        with tag('name'):
            text('Paul')
    with tag('person', id = '2'):
        with tag('name'):
            text('Jacques')
 
result = indent(
    doc.getvalue(),
    indentation = ' '*4,
    newline = '\r\n'
)
 
print(result)

Ce bout de code permet de générer:

 
 
 
 
 
Pierre
 
 
 
 
 
Paul
 
 
 
 
 
Jacques
]]>
By: Sam http://sametmax.com/les-context-managers-et-le-mot-cle-with-en-python/#comment-89347 Tue, 08 Jul 2014 18:25:31 +0000 http://sametmax.com/?p=1987#comment-89347 J’ai corrigé toutes les coquilles. Merci pour votre vigilance, les articles gagnent vraiment en qualité quand vous corrigez mes conneries :)

]]>
By: bato-san http://sametmax.com/les-context-managers-et-le-mot-cle-with-en-python/#comment-89145 Tue, 08 Jul 2014 15:02:24 +0000 http://sametmax.com/?p=1987#comment-89145 @Lujeni

@TimeIt
def ma_fonction():
  blabla

correspond a :

def ma_fonction():
   blabla
   ma_fonction = TimeIt(ma_fonction)

or ici TimeIt est la ref d une classe et non pas d une instance de classe , donc ” TimeIt(ma_fonction) ” appelle la méthode __new__() de TimeIt ( et non pas __call__() ) et lui passe en paramètre une fonction , ce qui n est pas apprecié de la part du compilateur X)
Pour appeler la méthode __call__() (et qu accessoirement ca marche ;v ), il faut donc écrire :

def ma_fonction():
  blabla
  ma_fonction = TimeIt()(ma_fonction)

soit:

@TimeIt()
def ma_fonction():
  blabla

En espérant avoir aidé :)

]]>
By: hamzahik http://sametmax.com/les-context-managers-et-le-mot-cle-with-en-python/#comment-23961 Tue, 15 Apr 2014 12:00:56 +0000 http://sametmax.com/?p=1987#comment-23961 with OpenFile('/etc/fstab') as f:
for line in f:
print line #au lieu de "print f" je pense

]]>
By: Lujeni http://sametmax.com/les-context-managers-et-le-mot-cle-with-en-python/#comment-7528 Sun, 31 Mar 2013 00:01:40 +0000 http://sametmax.com/?p=1987#comment-7528 Hello, dans l’exemple du code mixant Decorator&Context il manque un t sur la ligne self.start = datetime.dateime.now(). L’utilisation du decorator TimeIt semble lèver une exception TypeError: object.__new__() takes no parameters.

]]>
By: Etienne http://sametmax.com/les-context-managers-et-le-mot-cle-with-en-python/#comment-5805 Fri, 01 Feb 2013 10:55:42 +0000 http://sametmax.com/?p=1987#comment-5805 Vraiment chouette tout ça. Ce qui est bien, c’est que les contextmanager peuvent être utilisé sur des bouts de code de taille arbitraire.

Je pense à ton TimeIt par exemple, qui pourrait logger le temps d’exécution de portions de code critique (genre query dans db qui grossit rapidement), et/ou pourrait effectuer un action si ce temps dépasse un seuil donné.

Sympa, sympa

]]>
By: Sam http://sametmax.com/les-context-managers-et-le-mot-cle-with-en-python/#comment-1830 Thu, 13 Sep 2012 11:59:17 +0000 http://sametmax.com/?p=1987#comment-1830 Au passage, j’ai eu la question:

“Mais en quoi c’est utile le context manager pour open ?”

try:
    with open("fichier", "r") as f:
        ligne = f.readline()
except IOError:
    print "Erreur"

“Est a peine plus court que:”

try:
    f = open("fichier", "r")
    ligne = f.readline()
except IOError:
    print "Erreur"
finally:
    f.close()

Alors je note la réponse ici:

Ces deux codes ci-dessus ne sont PAS équivalents.

En effet, l’équivalent sans le context manager est:

try:
    f = open("fichier", "r")
    try:
        ligne = f.readline()
    finally:
        f.close()
except IOError:
    print "Erreur"

Avec un double try imbriqué.

En effet, il peut y avoir une erreur à l’ouverture du fichier, et dans ce cas la clause finally va planter, car f n’existera pas !

Utiliser with permet de s’affranchir de ce genre de petits détails.

]]>
By: Sébastien http://sametmax.com/les-context-managers-et-le-mot-cle-with-en-python/#comment-1701 Tue, 04 Sep 2012 17:18:07 +0000 http://sametmax.com/?p=1987#comment-1701 Très bon article ! Merci les gars !

]]>
By: Sam http://sametmax.com/les-context-managers-et-le-mot-cle-with-en-python/#comment-1700 Tue, 04 Sep 2012 14:07:23 +0000 http://sametmax.com/?p=1987#comment-1700 Merci zariko.

Maintenant il faut que je trouve un moyen de placer “la fin des zarikos” dans un blog post.

]]>
By: Zariko http://sametmax.com/les-context-managers-et-le-mot-cle-with-en-python/#comment-1698 Tue, 04 Sep 2012 11:54:20 +0000 http://sametmax.com/?p=1987#comment-1698 Super article !

Petite typo sur le ContextDecorator: @functools.wraps => @wraps

]]>