Le mot-clé with a été ajouté dans Python 2.5. Il est utilisé pour remplacer le modèle try...sauf...finalement....
L'instruction with est utilisée pour accéder aux ressources. Assurez-vous que peu importe si une exception se produit lors de l'utilisation, les opérations de « nettoyage » nécessaires seront effectuées et les ressources seront libérées. Par exemple, les fichiers sont automatiquement fermés après utilisation et les verrous dans les threads sont automatiquement acquis et libérés.
with EXPR [ as VAR ]: BLOCK 简单说明: 1,EXPR可以是任意表达式。 2,as VAR是可选的。 3,BLOCK是with语句的语句体
est expliqué :
1, calculez EXPR et obtenez un gestionnaire de contexte .
2, la méthode exit() du gestionnaire de contexte est enregistrée pour les appels suivants.
3, appelez la méthode enter() du gestionnaire de contexte
4, si l'expression with contient comme VAR, alors la valeur de retour d'EXPR est affectée à VAR .
5, exécutez l'expression dans le BLOC
6, ajustez la méthode exit() du gestionnaire de contexte. Si une exception se produit pendant l'exécution de BLOCK et provoque la sortie du programme, le type, la valeur et le traçage dans l'exception (c'est-à-dire la valeur de retour de sys.exc_info()) seront transmis en tant que paramètres pour sortir. () puis l'exception est levée dans la console. Sinon, trois valeurs Aucune seront transmises.
mgr = (EXPR) exit = type(mgr).__exit__ # 这里没有执行 value = type(mgr).__enter__(mgr) exc = True try: try: VAR = value # 如果有 as VAR BLOCK except: exc = False if not exit(mgr, *sys.exc_info()): raise finally: if exc: exit(mgr, None, None, None)
Num04–>Aucun cas d'exceptionRemarque :
1, s'il n'y a pas de entrez( dans le gestionnaire de contexte ) ou exit(), alors l'interpréteur lancera une AttributeError.
2 Après qu'une exception se produit dans BLOCK, si exit( )<. 🎜> renvoie une valeur qui peut être considérée comme True, alors cette exception ne sera pas levée et le code suivant continuera à s'exécuter.
class my_name: def __enter__(self): print("调用__enter__()方法") return "xiaoke" def __exit__(self, type, value, trace): print("调用__exit__()方法") def get_name(): return my_name() with get_name() as name: print("my name is :", name) # 结果如下: # 调用__enter__()方法 # my name is : xiaoke # 调用__exit__()方法
class number: # with语句执行的时候调用 def __enter__(self): print("调用_enter_()方法") return self # with语句执行完毕,结束的时候调用 def __exit__(self, type, value, trace): print("type:", type) print("value:", value) print("trace:", trace) # 当有异常的时候,那么就不会有返回值 def do_number(self): num = 10 / 0 return num + 100with number()as result: res = result.do_number() print(res) # 结果如下: # 调用_enter_()方法 # type: <class 'ZeropisionError'> # value: pision by zero # trace: <traceback object at 0x00000224182AE388> # Traceback (most recent call last): # File "E:/pycharmProject/Test49.py", line 56, in <module> # res = result.do_number() # File "E:/pycharmProject/Test49.py", line 51, in do_number # num = 10 / 0 # ZeropisionError: pision by zero
官网代码:import asyncio async def coro(name, lock): print('coro {}: waiting for lock'.format(name)) async with lock: print('coro {}: holding the lock'.format(name)) await asyncio.sleep(1) print('coro {}: releasing the lock'.format(name)) loop = asyncio.get_event_loop() lock = asyncio.Lock() coros = asyncio.gather(coro(1, lock), coro(2, lock))try: loop.run_until_complete(coros)finally: loop.close()
Code de sortie :
coro 1: waiting for lock coro 1: holding the lock coro 2: waiting for lock coro 1: releasing the lock coro 2: holding the lock coro 2: releasing the lock
Les références des articles sont les suivantes : 1 , Site officiel : https://www.python.org/dev/peps/pep-0343/2
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!