基本问题:制作我自己的自定义警告类最符合 Pythonic/逻辑的方式是什么?我应该继承哪些正确的警告和异常类?
动机:我正在编写的库的要求指定,如果一个MyContainer
对象c
包含一个项目x
,并且库的调用者试图将一个“重复” x
——调用它y
——放入c
,则会向调用者发出警告,并且的返回值c.my_transformation_method(x, y)
被放入c
替换x
。换句话说,MyContainer
s 将用它们的重复元素替换元素,但这样做时必须警告用户。
根据我的阅读,警告库调用者有关非致命操作的最灵活方法是使用警告标准模块。它允许调用者在它认为合适的时候处理警告,做任何事情,从忽略警告到将它们视为错误。(请注意,我使用的是 Python 3,但我不认为这对这里的问题至关重要。)
示例:我所做的是定义了以下警告子类:
class DuplicateItemWarning(UserWarning, ValueError):
pass
然后在检测到尝试插入重复项时调用该add()
方法。MyContainer
warnings.warn('detected duplicate', DuplicateItemWarning)
具体问题:
我应该
UserWarning
像上面那样子类化,还是只是子类化Warning
?如果调用者想要将警告视为错误,则子类
ValueError
(在上面的示例中,它仅插入ValueError
到 MRO 之间Warning
)在语义上似乎是明智的。Exception
我没有看到这个有缺点吗?我在 StackOverflow 上找不到任何关于自定义警告类的问题。这是因为 Python 程序员甚至不喜欢使用该
warnings
模块吗?