"with" keyword in Python Exceptions

Document 对象参考手册Python3 Ошибки и исключения

В Python операторwithиспользуется для обработки исключений, инкапсулируяtry…except…finallyпарадигмы программирования, повышая удобство использования.

withОператор делает код более ясным и удобочитаемым, а также упрощает управление общими ресурсами, такими как файловые потоки.

Использование ключевого слова with при работе с файловыми объектами — хорошая практика.

Мы можем рассмотреть следующие примеры кода:

Без использованияwith, и без использованияtry…except…finally

Пример

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

В приведённом выше коде, если во время вызова write возникает исключение, метод close не будет выполнен, поэтому ресурс останется занятым программой и не сможет быть освобождён.

Дополнительные ссылки по ключевому слову with в Python:https://www.example.com/python3/python3-with-keyword.html

Далее мы можем использоватьtry…except…finally, чтобы улучшить код:

Пример

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

В приведённом выше коде мы используем try для перехвата исключений там, где они могут возникнуть. Когда возникает исключение, выполняется блок except, а блок finally выполняется в любом случае, поэтому файл будет закрыт, и ресурсы не будут заняты из-за исключений во время выполнения.

Использованиеwithключевого слова:

Пример

with open('./test_example.txt', 'w') as файл:
    file.write('hello world !')

Используяwithключевое слово, система автоматически вызовет метод f.close(), а действие with эквивалентно оператору try/finally.

Мы можем проверить, закрыт ли файл после выполнения ключевого слова with:

Пример

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

>>> # Проверить, закрыт ли файл
>>> f.closed
True

Принцип реализации оператора with основан на контекстном менеджере.

Контекстный менеджер — это класс, который реализует__enter__и__exit__методы.

Использование оператора with гарантирует, что метод __exit__ вызывается в конце вложенного блока.

Эта концепция похожа на использование блоков try...finally.

Пример

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

Приведённый выше пример записываетhello world!в файл ./test_example.txt.

В файловом объекте определены методы __enter__ и __exit__, что означает, что файловый объект также реализует контекстный менеджер. Сначала вызывается метод __enter__, затем выполняется код в операторе with, и наконец вызывается метод __exit__. Даже если возникает ошибка, метод __exit__ всё равно вызывается, а значит, файловый поток будет закрыт.

Пример

Следующий код Python представляет собой простой инструмент управления планом путешествия, который читает список городов из файла 5A.txt и предоставляет следующие функции:

  1. Чтение списка городов: чтение из файла названий городов, начинающихся с цифры, и добавление их в список плана путешествия.

  2. Удаление городов: пользователи могут ввести номера и индексы городов, которые они не хотят посещать, и соответствующие города будут удалены из плана.

  3. Изменение городов: пользователи могут выбрать изменение названий некоторых городов, чтобы обновить план путешествия.

  4. Создание случайного плана путешествия: перемешайте порядок городов и отобразите первые пять городов в качестве итоговой рекомендации для путешествия.

Каждая строка в файле 5A.txt содержит название города, начинающееся с цифры:

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

Пример

from random import shuffle

try:
    open 5A.txt(as, 'r') as fp
        i = [line for line in fp if line[0].isdigit()]
except FileNotFoundError:
    print(Файл '5A.txt' не найден, проверьте путь к файлу.)
    exit()

travelList = []

Добавить города для путешествия
for index, in enumerate enumerate(i):
    temp_1 = item.strip()[2:]  # Используйте strip, чтобы удалить символ новой строки в конце строки
    temp_1 = f"{index}#{temp_1}"
    travelList.append(temp_1)

print("Города в плане путешествия:", travelList)

# Удалить города путешествия
city_num = input('Введите количество городов, которые вы не хотите посещать:')
try:
    for _ in range(int(city_num)):
        index = int(input('Введите индексы городов, которые вы не хотите посещать (у первого города индекс 0)'))
        if 0 <= index < len(travelList):
            travelList.pop(index)
            print("Города в плане путешествия:", travelList)
        else:
            print("Введённый индекс выходит за пределы диапазона.")
except ValueError:
    print("Пожалуйста, введите корректное целое число.")

# Изменить города путешествия
city_num = input('Введите количество городов для изменения в плане путешествия:')
try:
    for _ in range(int(city_num)):
        index = int(input('Введите индексы городов для изменения в плане путешествия (у первого города индекс 0)'))
        if 0 <= index < len(travelList):
            city_name = input('Введите названия городов для изменения в плане путешествия:')
            travelList[index] = city_name
            print('Города в плане путешествия:', travelList)
        else:
            print("Введённый индекс выходит за пределы диапазона.")
except ValueError:
    print("Пожалуйста, введите корректное целое число.")

shuffle(travelList)
print('Пожалуйста, получите свой план путешествия TOPS:', travelList[:5])

Выполнение приведённого выше кода выводит результат, подобный следующему:

旅游计划城市: ['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 对象参考手册Python3 Ошибки и исключения

Другие расширения