88342


<https://docs.python.org/ja/3/library/warnings.html>  
などを見ておりますがいまいち理解できません。

出てきたウォーニングに対して、

  * 出ているウォーニングがどのクラス（Warning, UserWarning, DeprecationWarning・・・など ）に含まれるのか

  * それぞれ個別のウォーニングに対して、何か識別番号のようなものはあるのかないのか

というのは、どういう手段を使えばわかりますか？

現状出ているのは、

[code]

    　df = pd.read_json(json_data)
    
[/code]

を実行したときに出る

[code]

    　********** Warning **********
    　The beginning of the JASON data may be incorrect:Check func 関数名
    
[/code]

ですが、この質問では個別のウォーニングについてはあまり重要ではありません。

イメージとしては、

[code]

    try:
        a / b
    except ZeroDivisionError as e:
        エラー処理１
    except TypeError as e:
        エラー処理２
    
[/code]

というようなことをウォーニングに対してやりたいと思っています。  
ZeroDivisionError やTypeError にあたるものを知りたいと思っています。

よろしくお願いいたします。


CC BY-SA 4.0
2022-04-12T04:20:32.260
88285
2022-04-14T16:35:58.150
2022-04-14T16:27:00.667
3060
43160
question
python
Python で Warning についての情報取得や判別を行いたい


知識・経験があるわけではありませんが、参照先のPython仕様を見ると以下のようなことだと考えられます。

**出てきたウォーニングに対して、...というのは、どういう手段を使えばわかりますか？**

大まかに2つの方法があると考えられます。

  * [catch_warnings](https://docs.python.org/ja/3/library/warnings.html#warnings.catch_warnings) コンテキストマネージャーを使ってWarningをWarningのままで取り扱い、Warningが発生する可能性のある処理の後でチェックを行う。  
参照先仕様の [警告のテスト](https://docs.python.org/ja/3/library/warnings.html#testing-
warnings) に記述された方法。

  * [warnings.simplefilter](https://docs.python.org/ja/3/library/warnings.html#warnings.simplefilter) や [warnings.filterwarnings](https://docs.python.org/ja/3/library/warnings.html#warnings.filterwarnings) で指定したWarningを例外として扱い、処理を中断させ、質問に書かれたような`try except`で例外をキャッチし、チェックを行う。  
簡単には最初に`warnings.simplefilter('error')`とだけ書いておけば全てのWarningが例外になると考えられます。

両方併せてこちらの記事で簡単な例が提示されています。  
[How does Python catch warnings? (Note: not to catch the
exception)](https://www.codetd.com/en/article/12936033)

* * *

発生したWarningについての情報は、参照先仕様の以下の部分に記述されているものでしょう。  
[警告フィルタ](https://docs.python.org/ja/3/library/warnings.html#the-warnings-
filter)

> フィルタの各エントリは (action, message, category, module, lineno) からなるタプルです。

上記「警告のテスト」のコーディング例に以下のような記述があるので、Warningの`as w`に格納されたレコードの情報として`(action,
message, category, module, lineno)`が存在するのだと考えられます。

>
[code]

>     # Verify some things
>     assert len(w) == 1
>     assert issubclass(w[-1].category, DeprecationWarning)
>     assert "deprecated" in str(w[-1].message)
>  
[/code]

ただしどうもWarningを発生させる側で情報をどのように記述したかによって変わるようですね。  
[warn](https://docs.python.org/ja/3/library/warnings.html#warnings.warn) とか
[warn_explicit](https://docs.python.org/ja/3/library/warnings.html#warnings.warn_explicit)
で発生させた場合に記述されていない情報は`None`になっているので通知されたオブジェクトに存在しないこともあるようです。

ちなみに例外扱いした場合は、`as e`には細かい情報を載せるのは難しいように見えます。

なので、catch_warningsで扱って上手くいった場合には以下のような情報が取得出来るでしょう。

  1. 出ているウォーニングがどのクラス（Warning, UserWarning, DeprecationWarning・・・など ）に含まれるのか、  
→通知されたオブジェクトの`.category`で識別できると考えられます。

  2. それぞれ個別のウォーニングに対して、何か識別番号のようなものはあるのかないのか。  
→通知されたオブジェクトの`.module`, `lineno`, `message`
の内容で識別できると考えられます。ただし識別番号といった情報があるかどうかは、モジュールによると考えられます。


CC BY-SA 4.0
2022-04-14T15:17:56.830
88342
2022-04-14T16:35:58.150
2022-04-14T16:35:58.150
26370
26370
88285
answer