web-dev-qa-db-ja.com

プログラムを中断せずにPythonで警告を発生させる

私は、プログラムをクラッシュ/停止/中断させずに、Pythonで警告を発生させる方法の問題に対処しています。

ユーザーがゼロ以外の数値を渡した場合にのみチェックする次の単純な関数を使用します。ユーザーがゼロを渡すと、プログラムはユーザーに警告する必要がありますが、正常に続行します。次のコードのように機能するはずですが、警告を手動で出力する代わりに、クラスWarning()、Error()、またはException()を使用する必要があります。

def is_zero(i):
   if i != 0:
     print "OK"
   else:
     print "WARNING: the input is 0!"
   return i

以下のコードを使用して、関数に0を渡すと、プログラムがクラッシュし、値が返されることはありません。代わりに、プログラムを通常どおり続行し、ユーザーに関数に0を渡したことを通知するだけです。

def is_zero(i):
   if i != 0:
     print "OK"
   else:
     raise Warning("the input is 0!")
   return i

Unittestでテストして警告がスローされたことをテストできるようにしたいのです。メッセージを単純に出力する場合、unittestでassertRaisesを使用してテストすることはできません。

137
Tomas Novotny

警告をraiseしないでください。 warnings モジュールを使用する必要があります。上げると、警告ではなくエラーが発生します。

115
SilentGhost
import warnings
warnings.warn("Warning...........Message")

pythonのドキュメントを参照してください: here

222
necromancer

デフォルトでは、例外とは異なり、警告は中断しません。

import warningsの後に、警告を生成するときに Warnings クラスを指定できます。指定されていない場合、デフォルトでは文字通り UserWarning になります。

>>> warnings.warn('This is my lazy warning.')
<string>:1: UserWarning: This is my lazy warning.

代わりに既存のクラスを単純に使用するには、例えば Warning

>>> warnings.warn('This is my generic warning.', Warning)
<string>:1: Warning: This is my generic warning.

カスタム警告クラスの作成は、カスタム例外クラスの作成に似ています:

>>> class MyCustomWarning(UserWarning):
...     pass
... 
... warnings.warn('This is my custom warning.', MyCustomWarning)

<string>:1: MyCustomWarning: This is my custom warning.

テストのために、 assertWarns または assertWarnsRegex を検討してください。


代替として、特にスタンドアロンアプリケーションの場合は、loggingモジュールを検討してください。 debuginfowarningのレベルのメッセージを記録できます。 errorなど。warning以上のレベルのログメッセージは、デフォルトでstderrに出力されます。

31
Acumenus