¿Qué excepción debería plantear en combinaciones de argumentos incorrectos/ilegales en Python? [cerrado]

Resuelto cdleary asked hace 15 años • 8 respuestas

Me preguntaba cuáles son las mejores prácticas para indicar combinaciones de argumentos no válidas en Python. Me he encontrado con algunas situaciones en las que tienes 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 de esto es que cada paquete tiene el suyo propio, normalmente ligeramente diferente BadValueError. Sé que en Java existe java.lang.IllegalArgumentException: ¿se entiende bien que todos crearán sus propios BadValueErrorcorreos electrónicos en Python o hay otro método preferido?

cdleary avatar Nov 02 '08 06:11 cdleary
Aceptado

Simplemente plantearí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 hacerlo class BadValueError(ValueError):pass: su clase personalizada tiene un uso idéntico a ValueError , así que ¿por qué no usarla?

dbr avatar Nov 01 '2008 23:11 dbr

heredaría deValueError

class IllegalArgumentError(ValueError):
    pass

A veces es mejor crear sus propias excepciones, pero heredar de una incorporada, que es lo más parecida posible a lo que desea.

Si necesita detectar ese error específico, es útil tener un nombre.

Markus Jarderot avatar Nov 01 '2008 23:11 Markus Jarderot

Creo que la mejor manera de manejar esto es la forma en que Python lo maneja. Python genera 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 incorrectos 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.

J Bones avatar Aug 01 '2018 16:08 J Bones

Depende de cuál sea el problema con los argumentos.

Si el argumento tiene un tipo incorrecto, genera un TypeError. Por ejemplo, cuando obtienes una cadena en lugar de uno de esos booleanos.

if not isinstance(save, bool):
    raise TypeError(f"Argument save must be of type bool, not {type(save)}")

Sin embargo, tenga en cuenta que en Python rara vez realizamos comprobaciones como esta. Si el argumento realmente no es válido, alguna función más profunda probablemente se quejará por nosotros. Y si solo verificamos el valor booleano, tal vez algún usuario de código luego simplemente le proporcione una cadena sabiendo que las cadenas no vacías siempre son Verdaderas. Podría ahorrarle un yeso.

Si los argumentos tienen valores no válidos, genera ValueError. Esto parece más apropiado en su caso:

if recurse and not save:
    raise ValueError("If recurse is True, save should be True too")

O en este caso específico, tener un valor Verdadero de recursividad implica un valor Verdadero de guardar. Dado que consideraría esto como una recuperación de un error, es posible que también desee presentar una queja en el registro.

if recurse and not save:
    logging.warning("Bad arguments in import_to_orm() - if recurse is True, so should save be")
    save = True
Gloweye avatar Jun 25 '2019 08:06 Gloweye