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