基本的な質問:独自のカスタム警告クラスを作成する最も Pythonic/論理的な方法は何ですか? サブクラス化する必要がある正しい警告クラスと例外クラスは何ですか?
動機: 私が書いているライブラリの要件では、MyContainer
オブジェクトc
にアイテムが含まれていてx
、ライブラリの呼び出し元が の「複製」を配置しようとすると、x
それy
をc
呼び出して、呼び出し元に警告が発行され、の戻り値は、置換するためにc.my_transformation_method(x, y)
配置されます。言い換えると、s は要素をその複製に置き換えますが、そうするときはユーザーに警告する必要があります。c
x
MyContainer
私の読書に基づくと、致命的ではないアクションについてライブラリの呼び出し元に警告する最も柔軟な方法は、警告標準モジュールを使用することです。これにより、呼び出し元は、警告を無視することからエラーとして処理することまで、必要に応じて警告を処理できます。(私は Python 3 を使用していることに注意してください。ただし、ここでの質問にはそれが不可欠ではないと思います。)
例:私が行ったことは、次の警告サブクラスを定義することです:
class DuplicateItemWarning(UserWarning, ValueError):
pass
次に、重複するアイテムを挿入しようとする試みを検出したときにadd()
メソッドをMyContainer
呼び出します。warnings.warn('detected duplicate', DuplicateItemWarning)
具体的な質問:
上記のようにサブクラス化する必要がありますか
UserWarning
、それとも単にサブクラス化する必要がありWarning
ますか?呼び出し元が警告をエラーとして扱いたい場合に備えて、サブクラス
ValueError
(上の例でValueError
は、MRO の と の間にWarning
挿入するだけ) は意味的に適切に見えます。Exception
私が見ていないこれに欠点はありますか?警告クラスのカスタマイズに関する StackOverflow に関する以前の質問は見つかりませんでした。
warnings
これは、Python プログラマーがモジュールの使用を好まないからでしょうか?