Dropbox は、Python のビッグ ユーザーです。Python は、バックエンド サービスとデスクトップ クライアント アプリの両方で最も広く使用されています(Dropbox は Go、TypeScript、Rust のヘビー ユーザーでもあります)。 Dropbox の Python コードは数百万行にも及ぶ規模となっていますが、その動的型付けによってコードが必要以上に理解しにくくなり、生産性に深刻な影響を与えるようになりました。 これを軽減するため、現在私たちは最も普及している Python スタンドアロン型チェッカー、mypy による静的型チェックにコードを徐々に移行しています(mypy はオープン ソース プロジェクトであり、そのコア チームは Dropbox 内に設立されました)。 Dropbox は、この規模での Python 静的型チェックを導入した最初の企業の一つで
Code audit tool for Python. Pylama wraps these tools: pycodestyle (formerly pep8) © 2012-2013, Florent Xicluna; pydocstyle (formerly pep257 by Vladimir Keleshev) © 2014, Amir Rachum; PyFlakes © 2005-2013, Kevin Watters; Mccabe © Ned Batchelder; Pylint © 2013, Logilab; Radon © Michele Lacchia eradicate © Steven Myint; Mypy © Jukka Lehtosalo and contributors; Vulture © Jendrik Seipp and contributors
この記事はニフティグループ 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
mypyのdmypyの実装の仕方を把握する。知りたいことは裏側でのprocessの管理の仕方とクライアントとサーバー間のデータのやり取りの仕方。 準備 $ git clone --depth 1 git@github.com:python/mypy エントリーポイントの把握 インストールされるコマンドの確認(setup.py) setup(name='mypy', ... entry_points={'console_scripts': ['mypy=mypy.__main__:console_entry', 'stubgen=mypy.stubgen:main', 'dmypy=mypy.dmypy:main', ]}, data_files=data_files, ... mypy.dmypy:main()がエントリーポイント実際のファイル。 main.py ほとんどargparseを
地道な方法 地道に下の通り書くと型チェックを通りました。 def remove_none_iterator(it: Iterator[Optional[int]]) -> Iterator[int]: while True: try: elem = next(it) while elem is None: elem = next(it) yield elem except StopIteration: return def remove_none(iterable: Iterable[Optional[int]]) -> Iterable[int]: it = iter(iterable) return remove_none_iterator(it) ただしこれだと返り値が必ずイテレーターになってしまいます。しかしそもそも filter() 関数は iterable を受け取ってイテレー
Learn Languages 2018 というイベントで、最近のPythonについて発表してきました。 (一昨年まではLightweight LanguageでLLイベントだったのが、去年からLearn Languagesイベントになったらしい!) Python update in 2018 #ll2018jp from cocodrips www.slideshare.net せっかくなのでポイントだけでも書き起こして見ようと思います。 ここ1~2年で便利になった機能 1. The pathlib module (PEP 428) pathlibはファイルパスに関するモジュールで3.4で導入されました。 ただ、build-inのopenやos.pathモジュールがpathlib.Pathオブジェクトを受け入れられるようになったのがPython3.6(PEP519)となっています。 3.
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く