mypy

mypyのLiteral typesのお供には--strict-equalityオプションを

Type hints pythonでも型を書きたいですよね。type hintsがあります。 これが def hello(name): return f"hello {name}!" こう。 def hello(name: str) -> str: return f"hello {name}!" 型が指定できます。 Literal types ところで型の指定は文字列型だけで…

pythonでmypyを騙してfieldにmetadataを付加したクラスを定義してみる

ちょっとだけ背景説明 なんでそんなことがしたくなったかというと、やっぱり定義を記述したらおしまいでいられる世界が理想なので。そして特定の領域(e.g. OpenAPI, GraphQL, Protcol Buffers, database定義, ...)に属さないような中立的な表現が欲しくなっ…

pythonのtyping_extensions.Protocolがなぜ嬉しいか(propertyの例)

mypyで使えるProtocolが便利という話の例。 structural subtypingをやる際にgoでもほしいと想うことが多かった例がProtocolでは大丈夫なので良いなーという例(今回はそのうちのひとつだけを紹介)。 Protocol? Protocolをいつ使いたくなるかというと、大抵…

pythonでlogging.Loggerとlogging.LoggerAdapterを許す型を定義する方法のメモ

pythonでlogging.Loggerとlogging.LoggerAdapterを許す型を定義する方法のメモ。 別の言い方をするとunion typeとprotocolを使ったstructured subtypingの違いのメモ。 (:warning: おそらくまだProtocolをimportするにはtyping_extensionsが必要です) 例 例…

mypyのdmypyの実装のされ方を覗いてみた

mypyのdmypyの実装の仕方を把握する。知りたいことは裏側でのprocessの管理の仕方とクライアントとサーバー間のデータのやり取りの仕方。 準備 $ git clone --depth 1 git@github.com:python/mypy エントリーポイントの把握 インストールされるコマンドの確…

あとで調べる:mypyで分割代入でのエラーはtyping.Tupleなどの型のときしかみない?

以下のコードが通ってしまう。 import typing as t def f() -> t.Mapping: return {} def use() -> None: z = f() y, z = f() x, y, z = f() if __name__ == "__main__": import subprocess subprocess.check_call(["mypy", "--strict", __file__]) print("o…

mypyとTypedDictとtotalオプションについて

pythonでもdictに型を付けたいですね。一応TypedDictという型を定義したいという動きになっています。ちなみにまだこの機能はexperimentalになっているので。mypy_extensionsの方に入っています。 import mypy_extensions as mx class Pair(mx.TypedDict): l…

mypyのキーワード引数・デフォルト引数を持ったメソッドのプロトコルのメモ

デフォルト引数周りの型のことでちょっと把握できなかった部分があったのでメモ。 余分なデフォルト引数を持つ実装について 例えば、以下の様なプロトコルがあるとする。 import typing as t import typing_extensions as tx class Adder(tx.Protocol): def …

mypyの可変長な引数と戻り値の型の書き方

可変長引数 import typing as t import mypy_extensions as mx def f0() -> t.List[int]: return [] def f1(x0: int) -> t.List[int]: return [x0] def f2(x0: int, x1: int) -> t.List[int]: return [x0, x1] def fN(*xs: int) -> t.List[int]: return list…