0Pricing
Python Academy · Leçon

Schémas pratiques de gestionnaires de contexte

Appliquez les gestionnaires de contexte aux fichiers, aux verrous, aux minuteurs et aux connexions DB.

Schémas pratiques de gestionnaires de contexte est une leçon Python Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Python Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Python Academy comprend 4 leçons au total.

Introduction

Les gestionnaires de contexte résolvent élégamment les problèmes concrets de gestion des ressources, notamment pour les fichiers, les bases de données, les verrous, les minuteurs, et bien plus encore.

Chaîne de traitement des fichiers

Ouvrez ensemble les fichiers d'entrée et de sortie, traitez-les ligne par ligne, puis refermez-les automatiquement.
import io
src = io.StringIO('line1\nline2\nline3')
dst = io.StringIO()
with src, dst:
    for line in src:
        dst.write(line.upper())
print(dst.getvalue())

Transaction de base de données

Enveloppez les opérations de base de données dans un CM : validez en cas de réussite, annulez en cas d'exception, et fermez toujours la ressource.
from contextlib import contextmanager
@contextmanager
def db_transaction(conn):
    try:
        yield conn
        print('COMMIT')
    except Exception as e:
        print(f'ROLLBACK: {e}')
        raise
    finally:
        print('CLOSE')
with db_transaction({'execute': lambda q: print(f'SQL: {q}')}) as db:
    db['execute']('INSERT ...')

Verrouillage des threads

with lock: acquiert le verrou, exécute le corps, puis le libère à la sortie — aucun appel manuel à acquire ou release n'est nécessaire.
import threading
lock = threading.Lock()
shared = []
def add(x):
    with lock:
        shared.append(x)
add(1); add(2)
print(shared)

Changement de répertoire

os.chdir() modifie globalement le répertoire de travail. Un CM l'enregistre, puis le restaure.
from contextlib import contextmanager
import os
@contextmanager
def chdir(path):
    old = os.getcwd()
    os.chdir(path)
    try: yield
    finally: os.chdir(old)
original = os.getcwd()
with chdir('/tmp'):
    print('in tmp:', os.getcwd())
print('back:', os.getcwd())

Fichiers temporaires

tempfile.NamedTemporaryFile utilisé comme CM crée et supprime automatiquement un fichier temporaire.
import tempfile
with tempfile.NamedTemporaryFile(mode='w', suffix='.txt', delete=True) as f:
    f.write('temp data')
    print('temp file:', f.name)
print('deleted')

Modification d'une variable d'environnement

Définissez temporairement une variable d'environnement pour un test ou un sous-processus, puis restaurez sa valeur.
from contextlib import contextmanager
import os
@contextmanager
def env(**kwargs):
    old = {k: os.environ.get(k) for k in kwargs}
    os.environ.update({k:str(v) for k,v in kwargs.items()})
    try: yield
    finally:
        for k,v in old.items():
            if v is None: os.environ.pop(k,None)
            else: os.environ[k]=v
with env(DEBUG='1', LOG_LEVEL='DEBUG'):
    print(os.environ['DEBUG'])

Bloc de profilage

Enveloppez un bloc avec cProfile afin de mesurer ses performances dans un CM.
from contextlib import contextmanager
import cProfile
@contextmanager
def profile():
    pr = cProfile.Profile()
    pr.enable()
    yield pr
    pr.disable()
with profile() as pr:
    sum(range(1000000))
print('profiled')

Socket réseau

Les sockets implémentent le protocole des gestionnaires de contexte : with socket.socket() as s: ferme le socket à la sortie.
import socket
try:
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.settimeout(0.1)
        print('socket ready')
except Exception as e:
    print(f'socket: {e}')

Capture des avertissements

warnings.catch_warnings() capture les avertissements émis dans le bloc, ce qui est utile dans les tests.
import warnings
with warnings.catch_warnings(record=True) as w:
    warnings.simplefilter('always')
    warnings.warn('test warning')
print(len(w), w[0].category.__name__)

Combinaison de modèles

Dans les applications concrètes, les CM combinent souvent plusieurs modèles : transaction, journalisation et mesure du temps dans un seul composant réutilisable.
from contextlib import contextmanager
import time
@contextmanager
def timed_operation(name):
    print(f'[{name}] start')
    t0 = time.perf_counter()
    try:
        yield
        print(f'[{name}] done in {time.perf_counter()-t0:.4f}s')
    except Exception as e:
        print(f'[{name}] failed: {e}')
        raise
with timed_operation('loop'):
    sum(range(100000))

Vérification rapide

Quelle primitive de gestion des threads implémente le protocole des gestionnaires de contexte pour permettre un accès concurrent sécurisé ?

Récapitulatif

Modèles de gestionnaires de contexte : chaînes de traitement de fichiers, transactions de bases de données, verrous, changements de répertoire, fichiers temporaires, modifications de variables d'environnement et profilage. Utilisez ExitStack pour les piles de ressources dynamiques.

Continuez

Excellent travail ! La prochaine leçon vous attend.

Questions Fréquemment Posées

La leçon « Schémas pratiques de gestionnaires de contexte » est-elle gratuite ?

Oui — le texte complet de « Schémas pratiques de gestionnaires de contexte » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Python Academy, passe à CoddyKit PRO. Le cours Python Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Schémas pratiques de gestionnaires de contexte » ?

Appliquez les gestionnaires de contexte aux fichiers, aux verrous, aux minuteurs et aux connexions DB. Tu pratiques Python Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Python Academy ?

Aucune expérience préalable n'est requise. Python Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.

Combien de temps prend la leçon « Schémas pratiques de gestionnaires de contexte » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Python Academy ?

Oui. Chaque leçon Python Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. L’instruction with en profondeur
  2. Protocole __enter__ et __exit__
  3. contextlib : @contextmanager
  4. Schémas pratiques de gestionnaires de contexte
← Retour à Python Academy