PyCon JP 2020 の「Python 3.9 時代の型安全な Python の極め方」の発表資料です
たまには、他の人の役に立つ記事も書こうということで書いてみる。 例えば、以下のようなmix-inを使ったコードがあるとする。トリビアルな例で特に必要になりそうなコードではないけれど、まぁ説明のためのコードなので許してほしい。 EnumerableMixinはmap()を提供していて、このmap()や他のメソッド(定義されていないけれど)は、each()に依存するというmix-in。そしてListはeach()を実装するクラス。何の変哲もないmix-inのコード。 class EnumerableMixin: def map(self, fn): return [fn(x) for x in self.each()] class List(EnumerableMixin): def __init__(self, xs): self.xs = xs def each(self): return
この記事はニフティグループ Advent Calendar 2019の14日目の記事です。 昨日は@mito1296さんの「Terraformで立てたec2インスタンスをAnsibleで管理してみる」でした。 同様の問題に以前悩まされたことがあったのでタグ付けは非常に綺麗な解決方法だなと感心しました。 機会があれば、うちのチームでも導入したいですね!! TD;LD Pythonは型安全で無いので大きめのプロジェクトになると心理的な安全が担保できないので敬遠していました。 しかし、Python3.5以降typingが導入されmypyと組み合わせることで、少し大きめのプロジェクトでもコーティングする際に心理的な安全を得ることができるようになったので中規模の開発に採用できるようになりました。 今回は、python3.8からtyping.Protocolが正式に追加されたようなので紹介してみます。
mypyで使えるProtocolが便利という話の例。 structural subtypingをやる際にgoでもほしいと想うことが多かった例がProtocolでは大丈夫なので良いなーという例(今回はそのうちのひとつだけを紹介)。 Protocol? Protocolをいつ使いたくなるかというと、大抵は複数ある何かを同一視したくなった場合。 例えば以下の様な例があげられる。 クラスの継承関係を無視して同様のふるまいを持つものを同一視したいとき ある値を持つものを同一視したいとき 関数とcallable objectを同一視したいとき 同一視した表現を受け取って再帰的に同一視した表現を返したいとき (self-reference) mypyでの型チェックはnominalなので、こういう構造を利用して同一視したい場合にはstructural subtypingが欲しくなる。これ用のinterfa
この記事は Chainer/CuPy Advent Calendar 2018 の六日目です。前回は @marshi さんの「Chainerで確率分布が扱えるようになりました。chainer.distributionsの紹介」でした。 最近、Chainer に型ヒント (type hint) をつけるために色々と試行錯誤をしている。これによって、Chainer を使ったソフトウェアの型検査ができるようにしたり、PyCharm などの IDE でのオートコンプリートが機能するようにしたいと考えている。ここでは、既存の Python ライブラリに型を付けるにあたってのノウハウ的な話を共有したい。 型ヒントとは? 言うまでもなく Python は動的型付け (dynamic typing) なので、近年まで静的な型検査 (static type checking) には対応していなかった。そのた
デフォルト引数周りの型のことでちょっと把握できなかった部分があったのでメモ。 余分なデフォルト引数を持つ実装について 例えば、以下の様なプロトコルがあるとする。 import typing as t import typing_extensions as tx class Adder(tx.Protocol): def add(self, x: int, y: int) -> int: ... このAdder.addメソッドはデフォルト引数を持たない。一方で、デフォルト引数を持つような実装はこのプロトコルの制約を満たすのかということが気になる。 例えば以下のようなもの class A: def add(self, x: int, y: int, *, verbose: bool = False) -> int: return x + y class B: def add(self, x:
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く