Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonプログラムでの警告制御


警告は、プログラムのエラーとは異なります。エラーが発生した場合、Pythonプログラムは即座に終了します。一方、警告は致命的ではありません。特定のメッセージが表示されますが、プログラムは続行されます。警告は、厳密には例外ではない特定の条件をユーザーに警告するために発行されます。通常、キーワード/関数/クラスなどの特定のプログラミング要素の非推奨の使用法が見つかった場合に警告が表示されます。

警告メッセージは、Pythonの標準ライブラリの「warning」モジュールで定義されているwarn()関数によって表示されます。警告は、実際には組み込みのクラス階層のExceptionのサブクラスです。組み込みの警告サブクラスがいくつかあります。ユーザー定義のサブクラスも定義できます。

警告
非推奨警告
疑わしい構文機能に関する警告。
疑わしいランタイム機能に関する警告。
将来廃止される予定の機能に関する警告
Unicodeに関連する警告。
バイトおよびバイト配列に関連する警告。
リソースの使用に関連する警告。
これは、すべての警告カテゴリクラスの基本クラスです。
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()

  1. Pythonのissuperset()

    この記事では、Pythonでのissuperset()と、さまざまな分野でのその実装について学習します。 このメソッドは、セットBのすべての要素に引数として渡されるすべての要素セットAが含まれている場合はブール値Trueを返し、Aのすべての要素がBに存在しない場合はfalseを返します。 これは、BがAのスーパーセットである場合、それを意味します returns true; else False 例 いくつかの例を見てみましょう A = {'t','u','t','o','r','i',

  2. PythonでFloatingPointError例外をキャッチする方法は?

    FloatingPointErrorは、浮動小数点例外制御(fpectl)がオンになっている場合に、エラーが発生する浮動小数点演算によって発生します。 fpectlを有効にするには、-with-fpectlフラグを使用してコンパイルされたインタープリターが必要です。 指定されたコードは、例外を処理してそのタイプを見つけるために次のように書き直されます。 例 import sys import math import fpectl try: print 'Control off:', math.exp(700) fpectl.turnon_sigfpe() print '