Pythonプログラムでの警告制御
警告は、プログラムのエラーとは異なります。エラーが発生した場合、Pythonプログラムは即座に終了します。一方、警告は致命的ではありません。特定のメッセージが表示されますが、プログラムは続行されます。警告は、厳密には例外ではない特定の条件をユーザーに警告するために発行されます。通常、キーワード/関数/クラスなどの特定のプログラミング要素の非推奨の使用法が見つかった場合に警告が表示されます。
警告メッセージは、Pythonの標準ライブラリの「warning」モジュールで定義されているwarn()関数によって表示されます。警告は、実際には組み込みのクラス階層のExceptionのサブクラスです。組み込みの警告サブクラスがいくつかあります。ユーザー定義のサブクラスも定義できます。
これは、すべての警告カテゴリクラスの基本クラスです。 | |
UserWarning | warn()のデフォルトのカテゴリ。 |
これらの警告が開発者を対象としている場合の、非推奨の機能に関する警告 | |
SyntaxWarning | |
RuntimeWarning | |
FutureWarning | これらの警告がエンドユーザーを対象としている場合の、廃止された機能に関する警告。 |
PendingDeprecationWarning | |
ImportWarning | モジュールのインポートプロセス中にトリガーされた警告 |
UnicodeWarning | |
BytesWarning | |
ResourceWarning |
警告の例
次のコードは、非推奨のメソッドと、そのクラスの将来のバージョンで非推奨になる予定のメソッドを持つクラスを定義します。
# warningexample.py import warnings class WarnExample: def __init__(self): self.text = "Warning" def method1(self): warnings.warn( "method1 is deprecated, use new_method instead", DeprecationWarning ) print ('method1', len(self.text)) def method2(self): warnings.warn( "method2 will be deprecated in version 2, use new_method instead", PendingDeprecationWarning ) print ('method2', len(self.text)) def new_method(self): print ('new method', len(self.text)) if __name__=='__main__': e = WarnExample() e.method1() e.method2() e.new_method()
上記のスクリプトがコマンドプロンプトから実行された場合
E:\python37>python warningexample.py
端末に警告メッセージは表示されません。そのためには、以下のように_Wdスイッチを使用する必要があります
E:\python37>python -Wd warningexample.py warningexample.py:10: DeprecationWarning: method1 is deprecated, use new_method instead DeprecationWarning method1 7 warningexample.py:19: PendingDeprecationWarning: method2 will be deprecated in version 2, use new_method instead PendingDeprecationWarning method2 7 new method 7
同様に、次のインタラクティブセッションでも警告メッセージは表示されません。
E:\python37>python >>> from warningexample import WarnExample >>> e = WarnExample() >>> e.method1() method1 7 >>> e.method2() method2 7 >>> e.new_method() new method 7
–Wd
を使用してPythonセッションを開始する必要がありますE:\python37>python -Wd >>> from warningexample import WarnExample >>> e=WarnExample() >>> e.method1() E:\python37\warningexample.py:10: DeprecationWarning: method1 is deprecated, use new_method instead DeprecationWarning method1 7 >>> e.method2() E:\python37\warningexample.py:17: PendingDeprecationWarning: method2 will be deprecated in version 2, use new_method instead PendingDeprecationWarning method2 7 >>> e.new_method() new method 7
警告フィルター
警告フィルターは、警告を無視するか、表示するか、エラーに変えるか(例外を発生させるか)を制御します。
アクション | 意味 |
---|---|
次のインタラクティブセッションは、simplefilter()関数によってフィルターをデフォルトに設定します。
E:\python37>python >>> import warnings >>> warnings.simplefilter('default') >>> from warningexample import WarnExample >>> e=WarnExample() >>> e.method1() E:\python37\warningexample.py:10: DeprecationWarning: method1 is deprecated, use new_method instead DeprecationWarning method1 7 >>> e.method2() E:\python37\warningexample.py:17: PendingDeprecationWarning: method2 will be deprecated in version 2, use new_method instead PendingDeprecationWarning method2 7 >>> e.new_method() new method 7
警告を一時的に抑制するには、simplefilterを「ignore」に設定します。
import warnings def function(): warnings.warn("deprecated", DeprecationWarning) with warnings.catch_warnings(): warnings.simplefilter("ignore") function()
-
Pythonのissuperset()
この記事では、Pythonでのissuperset()と、さまざまな分野でのその実装について学習します。 このメソッドは、セットBのすべての要素に引数として渡されるすべての要素セットAが含まれている場合はブール値Trueを返し、Aのすべての要素がBに存在しない場合はfalseを返します。 これは、BがAのスーパーセットである場合、それを意味します returns true; else False 例 いくつかの例を見てみましょう A = {'t','u','t','o','r','i',
-
PythonでFloatingPointError例外をキャッチする方法は?
FloatingPointErrorは、浮動小数点例外制御(fpectl)がオンになっている場合に、エラーが発生する浮動小数点演算によって発生します。 fpectlを有効にするには、-with-fpectlフラグを使用してコンパイルされたインタープリターが必要です。 指定されたコードは、例外を処理してそのタイプを見つけるために次のように書き直されます。 例 import sys import math import fpectl try: print 'Control off:', math.exp(700) fpectl.turnon_sigfpe() print '