Mot-clé « with » dans les exceptions Python

Document 对象参考手册Erreurs et exceptions Python3

En Python, l'instructionwithest utilisée pour la gestion des exceptions, encapsulant les paradigmes de programmationtry…except…finally, améliorant la facilité d'utilisation.

withL'instruction rend le code plus clair et plus lisible, et elle simplifie la gestion des ressources courantes telles que les flux de fichiers.

Utiliser le mot-clé with lors de la gestion des objets fichiers est une bonne pratique.

Nous pouvons examiner les exemples de code suivants :

Sans utiliserwith, et sans utilisertry…except…finally

Exemple

file = open('./test_example.txt', 'w')
file.write('hello world !')
file.close()

Dans le code ci-dessus, si une exception se produit lors de l'appel à write, la méthode close ne sera pas exécutée, donc la ressource restera occupée par le programme et ne pourra pas être libérée.

Plus de références pour le mot-clé with de Python :https://www.example.com/python3/python3-with-keyword.html

Ensuite, nous pouvons utilisertry…except…finallypour améliorer le code :

Exemple

file = open('./test_example.txt', 'w')
try:
    file.write('hello world')
finally:
    file.close()

Dans le code ci-dessus, nous utilisons try pour intercepter les exceptions là où elles peuvent se produire. Lorsqu'une exception se produit, le bloc except est exécuté, et le bloc finally est exécuté quoi qu'il arrive, ainsi le fichier sera fermé et les ressources ne seront pas occupées à cause des exceptions pendant l'exécution.

En utilisantwithcomme mot-clé :

Exemple

with open('./test_example.txt', 'w') as fichier:
    file.write('hello world !')

En utilisantwithcomme mot-clé, le système appellera automatiquement la méthode f.close(), et l'effet de with équivaut à l'instruction try/finally.

Nous pouvons vérifier si le fichier est fermé après l'exécution du mot-clé with :

Exemple

>>> with open('./test_example.txt') as f:
...     read_data = f.read()

>>> # Vérifier si le fichier est fermé
>>> f.closed
True

Le principe d'implémentation de l'instruction with repose sur le gestionnaire de contexte.

Un gestionnaire de contexte est une classe qui implémente la méthode__enter__et__exit__.

L'utilisation de l'instruction with garantit que la méthode __exit__ est appelée à la fin du bloc imbriqué.

Ce concept est similaire à l'utilisation de blocs try...finally.

Exemple

with open('./test_example.txt', 'w') as my_file:
    my_file.write('hello world!')

L'exemple ci-dessus écrithello world!dans le fichier ./test_example.txt.

Dans l'objet fichier, les méthodes __enter__ et __exit__ sont définies, ce qui signifie que l'objet fichier implémente également le gestionnaire de contexte. D'abord, la méthode __enter__ est appelée, puis le code dans l'instruction with est exécuté, et enfin la méthode __exit__ est appelée. Même si une erreur se produit, la méthode __exit__ est quand même appelée, ce qui signifie que le flux de fichier sera fermé.

Exemple

Le code Python suivant est un outil simple de gestion de plan de voyage qui lit une liste de villes à partir du fichier 5A.txt et fournit les fonctions suivantes :

  1. Lire la liste des villes: Lire les noms de villes commençant par un chiffre à partir du fichier et les ajouter à la liste du plan de voyage.

  2. Supprimer des villes: Les utilisateurs peuvent saisir le numéro et les indices des villes qu'ils ne veulent pas visiter, et les villes correspondantes seront retirées du plan.

  3. Modifier des villes: Les utilisateurs peuvent choisir de modifier les noms de certaines villes pour mettre à jour le plan de voyage.

  4. Générer un plan de voyage aléatoire: Mélanger l'ordre des villes et afficher les cinq premières villes comme recommandation finale de voyage.

Chaque ligne du fichier 5A.txt contient un nom de ville commençant par un chiffre :

1. 北京
2. 上海
3. 广州
4. 深圳
5. 成都
6. 杭州
7. 西安
8. 重庆
9. 南京
10. 苏州

Exemple

from random import shuffle

try:
    with open('5A.txt', 'r') as fp:
        i = [line for line in fp if line[0].isdigit()]
except FileNotFoundError:
    print("Fichier '5A.txt' introuvable, veuillez vérifier le chemin du fichier.")
    exit()

travelList = []

# Ajouter les villes de voyage
for index, item in enumerate(i):
    temp_1 = item.strip()[2:]  # Utiliser strip pour supprimer le saut de ligne à la fin de la ligne
    temp_1 = f"{index}#{temp_1}"
    travelList.append(temp_1)

print("Villes du plan de voyage :", travelList)

# Supprimer les villes du voyage
city_num = input('Entrez le nombre de villes que vous ne voulez pas visiter :')
try:
    for _ in range(int(city_num)):
        index = int(input('Entrez les indices des villes que vous ne voulez pas visiter (la première ville a l'indice 0)'))
        if 0 <= index < len(travelList):
            travelList.pop(index)
            print("Villes du plan de voyage :", travelList)
        else:
            print("L'indice saisi est hors limites.")
except ValueError:
    print("Veuillez saisir un entier valide.")

# Modifier les villes du voyage
city_num = input('Entrez le nombre de villes à modifier dans le plan de voyage :')
try:
    for _ in range(int(city_num)):
        index = int(input('Entrez les indices des villes à modifier dans le plan de voyage (la première ville a l'indice 0)'))
        if 0 <= index < len(travelList):
            city_name = input('Entrez les noms des villes à modifier dans le plan de voyage :')
            travelList[index] = city_name
            print('Villes du plan de voyage :', travelList)
        else:
            print("L'indice saisi est hors limites.")
except ValueError:
    print("Veuillez saisir un entier valide.")

shuffle(travelList)
print('Veuillez récupérer votre plan de voyage TOPS :', travelList[:5])

L'exécution du code ci-dessus produit une sortie semblable à ce qui suit :

旅游计划城市: ['0# 北京', '1# 上海', '2# 广州', '3# 深圳', '4# 成都', '5# 杭州', '6# 西安', '7# 重庆', '8# 南京', '9#. 苏州']
输入不想旅游城市的个数:0
输入修改计划旅游的城市个数:3
输入修改计划旅游的城市序号(第1个城市索引为0)4
输入修改计划旅游的城市名称:7
旅游计划城市: ['0# 北京', '1# 上海', '2# 广州', '3# 深圳', '7', '5# 杭州', '6# 西安', '7# 重庆', '8# 南京', '9#. 苏州']

Document 对象参考手册Erreurs et exceptions Python3

Autres extensions