Pregunta básica: ¿Cuál es la forma más lógica y pitónica de crear mis propias clases de advertencia personalizadas? ¿Cuáles son las clases correctas de advertencia y excepción que debería estar subclasificando?Advertencias Pythonic, personalizadas
motivación: Los requisitos para la biblioteca que estoy escribiendo especifica que si un objeto c
MyContainer
contiene un elemento x
y el llamador de la biblioteca intenta colocar un "duplicado" de x
- llamarlo y
- en c
, se emite una advertencia a la persona que llama y el valor de retorno de c.my_transformation_method(x, y)
se coloca en c
para reemplazar x
. En otras palabras, MyContainer
s reemplazará los elementos con sus duplicados, pero debe advertir al usuario al hacerlo.
Según mis lecturas, la forma más flexible de advertir a la persona que llama de una biblioteca sobre una acción no fatal es con el warnings standard module. Permite que la persona que llama maneje la advertencia como lo considere conveniente, haciendo cualquier cosa, desde ignorar las advertencias hasta tratarlas como errores. (Tenga en cuenta que estoy usando Python 3, pero no creo que eso es esencial para la cuestión aquí.)
Ejemplo: Lo que he hecho se define de la siguiente subclase advertencia:
class DuplicateItemWarning(UserWarning, ValueError):
pass
Luego, el método add()
de MyContainer
llama al warnings.warn('detected duplicate', DuplicateItemWarning)
cuando detecta un intento de insertar un elemento duplicado.
preguntas específicas:
¿Debo subclassing
UserWarning
que el anterior, o simplemente sublcassingWarning
?Parece sensato semánticamente subclase
ValueError
(que, en el ejemplo anterior, simplemente insertaValueError
en el MRO entreWarning
yException
) en el caso de una persona que llama quiere tratar a los avisos como errores. ¿Hay algún inconveniente en esto que no estoy viendo?No pude encontrar ninguna pregunta previa sobre StackOverflow sobre la personalización de clases de advertencia. ¿Esto es porque los programadores de Python ni siquiera les gusta usar el módulo
warnings
?
IMO, el enfoque más pitónico es simplemente usar las advertencias y excepciones incorporadas, proporcionando su propio mensaje. ¿Cuál es el caso para la subclasificación? – Wilduck
@Wilduck Quizás necesite crear otros tipos de advertencias para esta biblioteca, pero también me gusta la semántica de tener una advertencia que también es un 'ValueError'. En cualquier caso, ¿cuál es la advertencia incorporada correcta para usar en esta situación? '¿Advertencia? 'UserWarning'? – wkschwartz
Creo que ciertamente no es 'Advertencia'. Es la clase base de todas las advertencias. Consulte http://docs.python.org/py3k/library/warnings.html#warning-categories para obtener una lista completa, depende de lo que su advertencia debería significar – jadkik94