Maison >développement back-end >Tutoriel Python >Explication détaillée des exemples d'utilisation de with et contextlib dans le didacticiel de base Python

Explication détaillée des exemples d'utilisation de with et contextlib dans le didacticiel de base Python

巴扎黑
巴扎黑original
2017-08-09 11:02:251630parcourir

Cet article présente principalement l'utilisation de with et contextlib en Python. Il analyse en détail les fonctions, les méthodes d'utilisation et les précautions associées sous forme d'exemples. Les amis dans le besoin peuvent s'y référer

Les exemples de cet article décrivent l'utilisation de with et contextlib en Python. Partagez-le avec tout le monde pour votre référence, les détails sont les suivants :

Dans le processus de codage normal, le scénario with qui est souvent utilisé est (ouvrir un fichier pour le traitement du fichier, puis exécuter implicitement la fermeture du file handle, qui convient également aux classes sockets), ces classes prennent en charge with) :


with file('test.py','r') as f :
  print f.readline()
Le rôle de with est similaire à try...enfin ..., fournissant un mécanisme de contexte, la classe qui utilise l'instruction with doit fournir deux fonctions intégrées __enter__ et __exit__. Le premier est exécuté avant l’exécution du code principal et le second est exécuté après l’exécution du code principal. Les variables après as sont renvoyées dans la fonction __enter__. Grâce à l'extrait de code et aux commentaires suivants, vous pouvez clairement comprendre l'utilisation de __enter__ et __exit__ :


#!encoding:utf-8
class echo :
  def output(self) :
    print 'hello world'
  def __enter__(self):
    print 'enter'
    return self #返回自身实例,当然也可以返回任何希望返回的东西
  def __exit__(self, exception_type, exception_value, exception_traceback):
    #若发生异常,会在这里捕捉到,可以进行异常处理
    print 'exit'
    #如果改__exit__可以处理改异常则通过返回True告知该异常不必传播,否则返回False
    if exception_type == ValueError :
      return True
    else:
      return False
with echo() as e:
  e.output()
  print 'do something inside'
print '-----------'
with echo() as e:
  raise ValueError('value error')
print '-----------'
with echo() as e:
  raise Exception('can not detect')
Résultats en cours d'exécution :

contextlib est un module qui renforce l'instruction with et fournit un mécanisme de contexte. Il est implémenté via Generator. La gestion du contexte en définissant les classes et en écrivant __enter__ et __exit__ n'est pas difficile, mais c'est fastidieux. Le contextmanager de contextlib sert de décorateur pour fournir un mécanisme de gestion de contexte au niveau de la fonction. Les frameworks couramment utilisés sont les suivants :


from contextlib import contextmanager
@contextmanager
def make_context() :
  print 'enter'
  try :
    yield {}
  except RuntimeError, err :
    print 'error' , err
  finally :
    print 'exit'
with make_context() as value :
  print value
contextlib a également deux choses importantes, l'une est imbriquée et l'autre se ferme. Le premier est utilisé pour créer des contextes imbriqués, et ce dernier Utilisé pour vous aider à exécuter la fonction de fermeture définie. Mais nested est obsolète, car with peut déjà être directement imbriqué dans plusieurs contextes. Voici un exemple :


from contextlib import contextmanager
from contextlib import nested
from contextlib import closing
@contextmanager
def make_context(name) :
  print 'enter', name
  yield name
  print 'exit', name
with nested(make_context('A'), make_context('B')) as (a, b) :
  print a
  print b
with make_context('A') as a, make_context('B') as b :
  print a
  print b
class Door(object) :
  def open(self) :
    print 'Door is opened'
  def close(self) :
    print 'Door is closed'
with closing(Door()) as door :
  door.open()
Résultat d'exécution :

Résumé : python Il existe de nombreuses fonctionnalités puissantes. Parce que nous sommes généralement habitués à certaines habitudes de programmation antérieures en C++ ou en Java, nous négligeons souvent ces bons mécanismes. Par conséquent, nous devons apprendre à utiliser ces fonctionnalités de Python pour que les programmes Python que nous écrivons ressemblent davantage à Python.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn