Comment comprendre l'instruction with en Python

零到壹度
Libérer: 2018-04-02 11:18:28
original
2817 Les gens l'ont consulté


Cet article partage avec vous une explication détaillée de la façon de comprendre le fonctionnement de l'instruction with en Python. J'espère qu'il pourra aider les amis dans le besoin.

Num01–>La source de l'instruction with

Le mot-clé with a été ajouté dans Python 2.5. Il est utilisé pour remplacer le modèle try...sauf...finalement....

Num02–> Fonction de l'instruction with

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.

Num03–> Le format de syntaxe de l'instruction with

with EXPR [ as  VAR ]:
    BLOCK
    
    简单说明:
    1,EXPR可以是任意表达式。
    2,as  VAR是可选的。
    3,BLOCK是with语句的语句体
Copier après la connexion

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.

Le processus ci-dessus est exprimé en code comme suit :

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)
Copier après la connexion

Remarque :

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.

Num04–>Aucun cas d'exception

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__()方法
Copier après la connexion
Num05–>Cas d'exception

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 &#39;ZeropisionError&#39;>
    # 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
Copier après la connexion
Num06–> , utilisez with dans la coroutine et ajoutez le mot-clé async

官网代码:import asyncio

async def coro(name, lock):
    print(&#39;coro {}: waiting for lock&#39;.format(name))
    async with lock:
        print(&#39;coro {}: holding the lock&#39;.format(name))
        await asyncio.sleep(1)
        print(&#39;coro {}: releasing the lock&#39;.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()
Copier après la connexion
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
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal