元々の話題: python 初学者にオススメできる例外についての知見あれば
- そもそも壊れてはいけない用途で python を使ってはいけない. なので適当でも許される. (暴論)
- linter を入れる.
- 特に flake8 とかは B001 とかを警告してくれるので大事.
- (脇道に逸れるが, linter はまずは linter/formatter orchestrator の pysen を入れておけばよい. 初学者なら poetry + pytest + pysen から始めるのがオススメ. 例: https://github.com/kenoss/pyproject-indirect-import-detector)
- Pythonic way を把握しておく.
- document
- PEP 8 とかで定められたりはしていない. (はず.) (flake8 は警告出してくれるが.)
- 特に, 多くの標準/サードパーティライブラリは例外を投げる前提で設計されていることを利用者および読み手として頭に入れておく.
- エラー時だけではなく, 正常なケースでも例外が多用される. 例: https://docs.python.org/ja/3/library/queue.html#queue.Queue.get (これは API 設計が雑すぎる. この用法は書き手として真似る必要はない.)
- GeneratorExit や asyncio.CancelledError などが BaseException なことは注意しておくべき.
- cotext manager では例外以外のエラー伝達方法はない. (別途エラー用のチャネルに報告するとかはまぁありますが.)
- Result 型について
- 一応ライブラリは沢山ある. https://pypi.org/search/?q=result
- Rust っぽいのは https://github.com/dbrgn/result なんだけど, 作りが雑1.
- 個人的見解: アプリケーション内で利用するのはまぁ好きにすればという感じなんですが, ライブラリの IF としては露出させるべきではない.
- 現段階での python では残念ながら rust っぽい Result は実現できない.
- result ライブラリは Union を使っている が, Union は flatten されたりする し, sphinx 上で type alias が解決されて Union として表示されてしまったりする. 良くない.
- python に enum はない ので enum での実装は無理. (enum が作れたら是非教えて欲しい.)
- 残るは nominal subtyping を用いる方法で, これはまぁやればできるんじゃないかな, で放置してる...
- 書き味について: https://twitter.com/keno_ss/status/1422619923239428101 https://twitter.com/keno_ss/status/1396711434365460480
- 一応ライブラリは沢山ある. https://pypi.org/search/?q=result
- golang の多値っぽいエラー返却について
- 最有力. ライブラリの IF に使っても怒られなさそう.
- 欠点としては 型が煩雑なこと. golang は型を雑にすることで解決している.
まとめ
- Python やめた方がよいよ.
- どうしても使わざるを得ない場合はドキュメントをちゃんと読んで最低限 pythonic way に従うのがよいよ.
- 自分でエラーを送出する場合は golang っぽくやるのがよいよ.
https://github.com/dbrgn/result/blob/v0.6.0/result/result.py#L22
$ poetry run python
Python 3.8.2 (default, Apr 20 2020, 09:12:58)
[GCC 7.5.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from result import Ok
>>> Ok()
Ok(True)
静的型付き言語書いたことある???