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
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 valuecontextlib 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!