print - python try except pass
¿Qué excepción debería plantear en combinaciones de argumentos incorrectos/ilegales en Python? (6)
Me preguntaba sobre las mejores prácticas para indicar combinaciones de argumentos no válidos en Python. Me he encontrado con algunas situaciones en las que tiene una función como esta:
def import_to_orm(name, save=False, recurse=False):
"""
:param name: Name of some external entity to import.
:param save: Save the ORM object before returning.
:param recurse: Attempt to import associated objects as well. Because you
need the original object to have a key to relate to, save must be
`True` for recurse to be `True`.
:raise BadValueError: If `recurse and not save`.
:return: The ORM object.
"""
pass
La única molestia con esto es que cada paquete tiene su propio BadValueError
, que suele ser ligeramente diferente. Sé que en Java existe java.lang.IllegalArgumentException
. ¿Se entiende que todo el mundo creará su propio BadValueError
s en Python o hay otro método preferido?
Creo que la mejor manera de manejar esto es la forma en que Python lo maneja. Python plantea un TypeError. Por ejemplo:
$ python -c ''print(sum())''
Traceback (most recent call last):
File "<string>", line 1, in <module>
TypeError: sum expected at least 1 arguments, got 0
Nuestro desarrollador junior acaba de encontrar esta página en una búsqueda en Google de "argumentos erróneos de excepción de Python" y me sorprende que la respuesta obvia (para mí) nunca se haya sugerido en la década desde que se hizo esta pregunta.
De acuerdo con la sugerencia de Markus de hacer rodar su propia excepción, pero el texto de la excepción debe aclarar que el problema está en la lista de argumentos, no en los valores de los argumentos individuales. Propondría
class BadCallError(ValueError):
pass
Se utiliza cuando faltan argumentos de palabras clave que fueron necesarios para la llamada específica, o los valores de los argumentos son válidos individualmente pero no son coherentes entre sí. ValueError
aún estaría en lo correcto cuando un argumento específico sea correcto, pero está fuera de rango.
¿No debería ser esto una excepción estándar en Python?
En general, me gustaría que el estilo de Python fuera un poco más definido para distinguir las entradas erróneas de una función (error de la persona que llama) de los malos resultados dentro de la función (error mío). Por lo tanto, también podría haber un error BadArgumentError para distinguir los errores de valor en los argumentos de los errores de valor en los locales.
Heredaría de ValueError
class IllegalArgumentError(ValueError):
pass
A veces es mejor crear sus propias excepciones, pero heredar de una incorporada, que es lo más cerca posible de lo que desea.
Si necesita detectar ese error específico, es útil tener un nombre.
La mayoría de las ValueError
acabo de ver el ValueError
incorporado usado en esta situación.
No estoy seguro de estar de acuerdo con la herencia de ValueError
. Mi interpretación de la documentación es que ValueError
se supone que solo se genera mediante builtins ... heredar de él o levantarlo usted mismo parece incorrecto.
Se genera cuando una operación o función incorporada recibe un argumento que tiene el tipo correcto pero un valor inapropiado, y la situación no se describe mediante una excepción más precisa, como IndexError.
Solo aumentaría ValueError , a menos que necesite una excepción más específica ...
def import_to_orm(name, save=False, recurse=False):
if recurse and not save:
raise ValueError("save must be True if recurse is True")
Realmente no tiene sentido hacer la class BadValueError(ValueError):pass
: su clase personalizada es idéntica en uso a ValueError , ¿por qué no usar eso?