"with" keyword in Python Exceptions
В Python операторwithиспользуется для обработки исключений, инкапсулируяtry…except…finallyпарадигмы программирования, повышая удобство использования.
withОператор делает код более ясным и удобочитаемым, а также упрощает управление общими ресурсами, такими как файловые потоки.
Использование ключевого слова with при работе с файловыми объектами — хорошая практика.
Мы можем рассмотреть следующие примеры кода:Без использованияwith, и без использованияtry…except…finally
Пример
file.write('hello world !')
file.close()
В приведённом выше коде, если во время вызова write возникает исключение, метод close не будет выполнен, поэтому ресурс останется занятым программой и не сможет быть освобождён.
Дополнительные ссылки по ключевому слову with в Python:https://www.example.com/python3/python3-with-keyword.html
Далее мы можем использоватьtry…except…finally, чтобы улучшить код:
Пример
try:
file.write('hello world')
finally:
file.close()
В приведённом выше коде мы используем try для перехвата исключений там, где они могут возникнуть. Когда возникает исключение, выполняется блок except, а блок finally выполняется в любом случае, поэтому файл будет закрыт, и ресурсы не будут заняты из-за исключений во время выполнения.
Использованиеwithключевого слова:
Пример
file.write('hello world !')
Используяwithключевое слово, система автоматически вызовет метод f.close(), а действие with эквивалентно оператору try/finally.
Мы можем проверить, закрыт ли файл после выполнения ключевого слова with:Пример
... read_data = f.read()
>>> # Проверить, закрыт ли файл
>>> f.closed
True
Принцип реализации оператора with основан на контекстном менеджере.
Контекстный менеджер — это класс, который реализует__enter__и__exit__методы.
Использование оператора with гарантирует, что метод __exit__ вызывается в конце вложенного блока.
Эта концепция похожа на использование блоков try...finally.
Пример
my_file.write('hello world!')
Приведённый выше пример записываетhello world!в файл ./test_example.txt.
В файловом объекте определены методы __enter__ и __exit__, что означает, что файловый объект также реализует контекстный менеджер. Сначала вызывается метод __enter__, затем выполняется код в операторе with, и наконец вызывается метод __exit__. Даже если возникает ошибка, метод __exit__ всё равно вызывается, а значит, файловый поток будет закрыт.
Пример
Следующий код Python представляет собой простой инструмент управления планом путешествия, который читает список городов из файла 5A.txt и предоставляет следующие функции:
Чтение списка городов: чтение из файла названий городов, начинающихся с цифры, и добавление их в список плана путешествия.
Удаление городов: пользователи могут ввести номера и индексы городов, которые они не хотят посещать, и соответствующие города будут удалены из плана.
Изменение городов: пользователи могут выбрать изменение названий некоторых городов, чтобы обновить план путешествия.
Создание случайного плана путешествия: перемешайте порядок городов и отобразите первые пять городов в качестве итоговой рекомендации для путешествия.
Каждая строка в файле 5A.txt содержит название города, начинающееся с цифры:
1. 北京 2. 上海 3. 广州 4. 深圳 5. 成都 6. 杭州 7. 西安 8. 重庆 9. 南京 10. 苏州
Пример
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#. 苏州']Другие расширения
Python3 Ошибки и исключения