82817


assert以外のエラー処理の書式をまねて、assertを書いてみたのですが、assert特有の文法（書式）のようなものがあるのでしょうか？

書いてみたコード。

[code]

    try:
        img0 = cv2.cvtColor(cv2.imread(jpgファイルパス 候補１), cv2.COLOR_BGR2RGB)
    except AssertionError as err:
        img0 = cv2.cvtColor(cv2.imread(jpgファイルパス 候補２), cv2.COLOR_BGR2RGB)
    
[/code]

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


CC BY-SA 4.0
2021-10-01T13:45:13.740
82807
2021-10-02T05:33:12.750
2021-10-02T02:16:46.763
19110
43160
question
python opencv
Pythonでassertがしたい


質問のような使い方は推奨されないようですね。こんな記事のコメントに記載があります。  
[How to handle AssertionError in Python and find out which line or statement
it occurred on?](https://stackoverflow.com/q/11587223/9014308)

> Two issues. First, if you are having trouble identifying where the exception
> is happening in your `try..except`, that's a sign your `try..except` block
> is too big. Second, the kind of thing meant to be caught by assert isn't
> something the user should ever see. If they see an `AssertionError`, the
> proper course of action is for them to contact the programmer and say
> "WTF?!".

> BTW: Asserts should be about the structure of your code, that is, an assert
> should fail only if you have a bug in your software. They should not be used
> to check user input. You might consider using a different exception for this
> application.

`try..except`で囲む範囲が広すぎる(今回の質問の例では複数メソッドの組み合わせ)と良くないとか、`assert`はソフトウェアのバグを検出するためのもので入力の確認(今回の質問の例では指定されたファイルが読み取れて変換できたか？)には使用しないように、というコメントになっています。

また質問の例では`AssertionError`が有った時に別のファイルの読み込み・変換を行うというおかしな対処になっています。

日本語でのこんな記事もあります。  
[Pythonで本当に役立つ機能「アサーション」の使い方を解説！『Pythonトリック』から](https://codezine.jp/article/detail/12179)

> アサーションの正しい使い方は、プログラム内の回復不可能なエラーについての情報を開発者に知らせることです。File-Not-
> Foundエラーのように、想定内のエラー状態を知らせることはアサーションの目的ではありません。そうした想定内のエラー状態では、ユーザーが修正措置を施すか、単にリトライすればよいわけです。
>
>
> アサーションはプログラムの内部セルフチェックと位置付けられており、コード内で何らかの状態をあり得ないものとして宣言します。こうした状態が1つでも発生すれば、プログラムにバグがあることになります

* * *

しかしながら、そうは言っても OpenCV では割と頻繁に`AssertionError`が発生します。

なのでここでは質問のタイトルが間違っていて、 **「Pythonでassertがしたい」** ではなく、
**「OpenCVのAssertionErrorに対処したい」** というタイトルにするべきでしょう。

複数メソッドの組み合わせをまとめて試すのではなく、個々のメソッド毎に`try..except`で囲んで、その原因毎に対処するのが正しいやり方だと思われます。

`cv2.imread()`で指定したファイルが無いとか形式が違うとかだと結果が`None`になって、そのまま`cv2.cvtColor()`に渡すとエラーになるので、そうした質問を良く見かけます。  
まずは`cv2.imread()`単独の結果を判定しましょう。

それに加えてパスに日本語を含むと問題があるようです。  
[Python OpenCV の cv2.imread 及び cv2.imwrite
で日本語を含むファイルパスを取り扱う際の問題への対処について](https://qiita.com/SKYS/items/cbde3775e2143cad7455)  
[【OpenCV/Python】日本語の画像ファイル読込・保存](https://imagingsolution.net/program/python/opencv-
python/read_save_image_files_in_japanese/)

質問の使い方では当てはまらないかもしれませんが、なんだかんだで`cv2.cvtColor()`でもエラーは発生するようです。  
[Error in OpenCV color conversion from BGR to
grayscale](https://stackoverflow.com/q/50319617/9014308)  
[opencv error Assertion failed
python](https://stackoverflow.com/q/30994624/9014308)

* * *

ちなみにサンプルコードにOpenCVを出したのは偶々であって、本当に`assert`について調べたい場合は、こちらの記事が参考になりそうです。  
[What's the difference between raise, try, and
assert?](https://stackoverflow.com/q/40182944/9014308)  
上記の勝手な日本語化記事  
[python : レイズ、トライ、アサーションの違いは何ですか？](https://www.fixes.pub/program/230253.html)

こちらは最後の方にassertが出てくるだけですが、例外処理全般の解説になっているでしょう。  
[Pythonのtry～exceptと例外処理と例外の詳細表示、raise,assert,独自の例外の定義方法まとめ](https://www.nblog09.com/w/2019/01/04/python-
try/)


CC BY-SA 4.0
2021-10-02T03:02:02.927
82817
2021-10-02T05:33:12.750
2021-10-02T05:33:12.750
26370
26370
82807
answer