La palabra clave 'with' en las excepciones de Python
Errores y excepciones en Python3
En Python, lawithsentencia se utiliza para el manejo de excepciones, encapsulatry…except…finallyel paradigma de codificación, mejorando la usabilidad.
withLa sentencia hace que el código sea más claro y legible, simplifica la gestión de recursos comunes como flujos de archivos.
Usar la palabra clave with al manejar objetos de archivo es una buena práctica.
Podemos ver los siguientes ejemplos de código:No usarwith, y tampoco usartry…except…finally
Ejemplo
file.write('hello world !')
file.close()
En el código anterior, si ocurre una excepción durante la llamada a write, el método close no se ejecutará, por lo que el recurso será ocupado por el programa y no podrá liberarse.
Más referencias sobre la palabra clave with en Python:https://www.example.com/python3/python3-with-keyword.html
A continuación, podemos usartry…except…finallypara mejorar el código:
Ejemplo
try:
file.write('hello world')
finally:
file.close()
En el código anterior, capturamos con try el código donde pueden ocurrir excepciones; cuando ocurre una excepción, se ejecuta el bloque except; el bloque finally se ejecuta siempre, por lo que el archivo se cerrará y no ocupará recursos debido a la excepción.
Usarwithla palabra clave:
Ejemplo
file.write('hello world !')
Usandowithla palabra clave, el sistema llama automáticamente al método f.close(); el efecto de with es equivalente al de la sentencia try/finally.
Podemos comprobar si el archivo está cerrado después de ejecutar la palabra clave with:Ejemplo
... read_data = f.read()
>>> # Verificar si el archivo está cerrado
>>> f.closed
True
El principio de implementación de la sentencia with se basa en el administrador de contexto.
Un administrador de contexto es una clase que implementa__enter__y__exit__los métodos.
El uso de la sentencia with asegura que el método __exit__ se llame al final del bloque anidado.
Este concepto es similar al uso del bloque try...finally.
Ejemplo
my_file.write('hello world!')
El ejemplo anterior escribehello world!en el archivo ./test_ejemplo.txt.
En el objeto de archivo se definen los métodos __enter__ y __exit__, es decir, el objeto de archivo también implementa el administrador de contexto. Primero se llama al método __enter__, luego se ejecuta el código dentro de la sentencia with y finalmente se llama al método __exit__. Incluso si ocurre un error, se llamará al método __exit__, es decir, se cerrará el flujo de archivo.
Ejemplo
El siguiente código de Python es una herramienta sencilla de gestión de planes de viaje. Lee la lista de ciudades del archivo 5A.txt y ofrece las siguientes funciones:
Leer la lista de ciudades: lee del archivo los nombres de ciudades que comienzan con un número y los agrega a la lista del plan de viaje.
Eliminar ciudades: el usuario puede ingresar la cantidad y el índice de las ciudades a las que no desea ir, eliminando las ciudades correspondientes del plan.
Modificar ciudades: el usuario puede optar por modificar los nombres de algunas ciudades y actualizar el plan de viaje.
Generar un plan de viaje aleatorio: baraja el orden de las ciudades y muestra las primeras cinco como recomendación final de viaje.
El archivo 5A.txt contiene en cada línea un nombre de ciudad que comienza con un número:
1. 北京 2. 上海 3. 广州 4. 深圳 5. 成都 6. 杭州 7. 西安 8. 重庆 9. 南京 10. 苏州
Ejemplo
try:
with open('5A.txt', 'r') as fp:
i = [line for line in fp if line[0].isdigit()]
except FileNotFoundError:
print("Archivo '5A.txt' no encontrado, verifique la ruta del archivo.")
exit()
travelList = []
# Agregar ciudades al plan de viaje
for index, item in enumerate(i):
temp_1 = item.strip()[2:] # Usar strip para eliminar el salto de línea al final de la línea
temp_1 = f"{index}#{temp_1}"
travelList.append(temp_1)
print("Ciudades del plan de viaje:", travelList)
# Eliminar ciudades del plan de viaje
city_num = input('Ingrese el número de ciudades a las que no desea viajar:')
try:
for _ in range(int(city_num)):
index = int(input('Ingrese el índice de las ciudades a las que no desea viajar (el índice de la primera ciudad es 0)'))
if 0 <= index < len(travelList):
travelList.pop(index)
print("Ciudades del plan de viaje:", travelList)
else:
print("El índice ingresado está fuera de rango.")
except ValueError:
print("Por favor, ingrese un número entero válido.")
# Modificar ciudades del plan de viaje
city_num = input('Ingrese el número de ciudades del plan de viaje a modificar:')
try:
for _ in range(int(city_num)):
index = int(input('Ingrese el índice de las ciudades del plan de viaje a modificar (el índice de la primera ciudad es 0)'))
if 0 <= index < len(travelList):
city_name = input('Ingrese el nombre de la ciudad del plan de viaje a modificar:')
travelList[index] = city_name
print('Ciudades del plan de viaje:', travelList)
else:
print("El índice ingresado está fuera de rango.")
except ValueError:
print("Por favor, ingrese un número entero válido.")
shuffle(travelList)
print('Reciba su plan de viaje TOPS:', travelList[:5])
Al ejecutar el código anterior, la salida es similar a la siguiente:
旅游计划城市: ['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#. 苏州']Otras extensiones