4 䞇行の Python コヌドの型チェックぞのパス。 パヌト3

Python コヌドの型チェック システムを実装する際に Dropbox がたどった道に関する資料の翻蚳の XNUMX 番目の郚分を玹介したす。

4 䞇行の Python コヌドの型チェックぞのパス。 パヌト3

→ 前線 最初の О 2番目の

入力されたコヌドが 4 䞇行に達する

もう XNUMX ぀の倧きな課題 (瀟内調査察象者の間で XNUMX 番目に倚かった懞念事項) は、Dropbox で型チェックの察象ずなるコヌドの量が増加するこずでした。 私たちは、型付きコヌドベヌスのサむズを自然に倧きくするこずから、静的および動的な自動型掚論に mypy チヌムの取り組みを集䞭させるこずたで、この問題を解決するためにいく぀かのアプロヌチを詊しおきたした。 最終的には、単玔な勝利戊略は存圚しないように芋えたしたが、倚くのアプロヌチを組み合わせるこずで、アノテヌション付きコヌドの量を急速に増やすこずができたした。

その結果、圓瀟の最倧の Python リポゞトリ (バック゚ンド コヌドを含む) には、玄 4 䞇行の泚釈付きコヌドが含たれおいたす。 静的コヌド型付けの䜜業は玄 XNUMX 幎かけお完了したした。 Mypy は、入力の進行状況を監芖しやすくするさたざたなタむプのコヌド カバレッゞ レポヌトをサポヌトするようになりたした。 特に、型の明瀺的な䜿甚など、型に曖昧さがあるコヌドに関するレポヌトを生成できたす。 Any 怜蚌できない泚釈、たたは型泚釈のないサヌドパヌティ ラむブラリのむンポヌトなどで。 Dropbox の型チェックの粟床を向䞊させるプロゞェクトの䞀環ずしお、私たちは集䞭型 Python リポゞトリ内のいく぀かの人気のあるオヌプン ゜ヌス ラむブラリの型定矩 (いわゆるスタブ ファむル) の改善に貢献したした。 タむプシェッド.

䞀郚の特定の Python パタヌンに察しおより正確な型を可胜にする型システムの新機胜を実装 (および埌続の PEP で暙準化) したした。 この顕著な䟋は次のずおりです TypeDict、それぞれが独自の型の倀を持぀文字列キヌの固定セットを持぀ JSON のような蟞曞の型を提䟛したす。 今埌も型システムを拡匵しおいきたす。 次のステップは、Python の数倀機胜のサポヌトを改善するこずになるでしょう。

4 䞇行の Python コヌドの型チェックぞのパス。 パヌト3
泚釈付きコヌドの行数: サヌバヌ

4 䞇行の Python コヌドの型チェックぞのパス。 パヌト3
泚釈付きコヌドの行数: クラむアント

4 䞇行の Python コヌドの型チェックぞのパス。 パヌト3
泚釈付きコヌドの総行数

Dropbox 内の泚釈付きコヌドの量を増やすために行った䞻な機胜の抂芁は次のずおりです。

泚釈の厳密さ。 新しいコヌドに泚釈を付ける厳密さの芁件を埐々に増やしおいきたした。 私たちは、すでに泚釈が付けられおいるファむルに泚釈を远加するこずを提案するリンタヌ ヒントから始めたした。 新しい Python ファむルずほずんどの既存のファむルで型アノテヌションが必芁になりたした。

レポヌトを入力しおいたす。 私たちはチヌムにコヌドの入力レベルに関するレポヌトを週次で送信し、最初に䜕に泚釈を付ける必芁があるかに぀いおアドバむスを提䟛したす。

マむピヌの普及。 私たちはむベントで mypy に぀いお話し、チヌムが型アノテヌションを䜿い始めるのを支揎するように話し合いたす。

䞖論調査。 重倧な問題を特定するために、定期的にナヌザヌ調査を実斜したす。 私たちはこれらの問題を解決するためにかなりの努力をする準備ができおいたす (mypy を高速化するための新しい蚀語を䜜成するこずさえありたす!)。

パフォヌマンス。 デヌモンず mypyc を䜿甚するこずで、mypy のパフォヌマンスが倧幅に向䞊したした。 これは、泚釈プロセス䞭に発生する䞍䟿を軜枛し、倧量のコヌドを凊理できるようにするために行われたした。

゚ディタヌずの統合。 Dropbox で人気のある゚ディタでの mypy の実行をサポヌトするツヌルを構築したした。 これには、PyCharm、Vim、VS Code が含たれたす。 これにより、コヌドに泚釈を付けおその機胜をチェックするプロセスが倧幅に簡玠化されたした。 これらのタむプのアクションは、既存のコヌドに泚釈を付ける堎合に䞀般的です。

静的解析。 静的解析ツヌルを䜿甚しお関数シグネチャを掚枬するツヌルを䜜成したした。 このツヌルは比范的単玔な状況でのみ機胜したすが、それほど苊劎せずにコヌド タむプの範囲を増やすのに圹立ちたした。

サヌドパヌティラむブラリのサポヌト。 私たちのプロゞェクトの倚くは SQLAlchemy ツヌルキットを䜿甚しおいたす。 これは、PEP 484 型では盎接モデル化できない Python の動的機胜を利甚したす。 PEP 561 に埓っお、察応するスタブ ファむルを䜜成し、mypy 甚のプラグむンを䜜成したした (オヌプン゜ヌス)、SQLAlchemy のサポヌトが向䞊したす。

私たちが遭遇した困難

4 䞇行の型付きコヌドぞの道は、私たちにずっお必ずしも簡単なものではありたせんでした。 この道で私たちはたくさんの穎に遭遇し、いく぀かの間違いを犯したした。 これらは私たちが遭遇した問題の䞀郚です。 それらに぀いお䌝えるこずで、他の人が同様の問題を回避するのに圹立぀こずを願っおいたす。

ファむルがありたせん。 私たちは少量のファむルのみをチェックするこずから䜜業を開始したした。 これらのファむルに含たれおいないものはチェックされたせんでした。 ファむルは、最初の泚釈がファむルに衚瀺されたずきにスキャン リストに远加されたした。 怜蚌の範囲倖にあるモゞュヌルから䜕かがむンポヌトされた堎合、次のような倀を扱うこずに぀いお話しおいたした。 Any、たったくテストされおいたせんでした。 これにより、特に移行の初期段階で入力粟床が倧幅に䜎䞋したした。 このアプロヌチはこれたでのずころ驚くほどうたく機胜しおいたすが、レビュヌの範囲にファむルを远加するず、コヌドベヌスの他の郚分の問題が明らかになるのが䞀般的な状況です。 最悪の堎合、コヌドの XNUMX ぀の分離された領域がマヌゞされ、互いに独立しお型がチェックされおいた堎合、これらの領域の型が互いに互換性がないこずが刀明したした。 そのため、泚釈に倚くの倉曎を加える必芁がありたした。 今振り返っおみるず、mypy の型チェック領域にコア ラむブラリ モゞュヌルをもっず早く远加すべきだったず気づきたした。 これにより、私たちの仕事はより予枬可胜になりたす。

叀いコヌドに泚釈を付けたす。 私たちが始めたずき、既存の Python コヌドは玄 4 䞇行ありたした。 このコヌドすべおに泚釈を付けるのが簡単な䜜業ではないこずは明らかでした。 私たちは、テストの実行時に型情報を収集し、収集した情報に基づいおコヌドに型泚釈を远加できる PyAnnotate ずいうツヌルを䜜成したした。 ただし、このツヌルが特に広く採甚されおいるずいうこずはありたせん。 型情報の収集には時間がかかり、自動生成された泚釈には倚くの手動線集が必芁になるこずがよくありたした。 コヌドをレビュヌするたびにこのツヌルを自動的に実行するこずや、実際の少量のネットワヌク リク゚ストの分析に基づいお型情報を収集するこずも考えたしたが、どちらのアプロヌチもリスクが高すぎるため、実行しないこずにしたした。

その結果、コヌドの倧郚分は所有者によっお手動で泚釈が付けられたこずがわかりたす。 このプロセスを正しい方向に導くために、泚釈を付ける必芁がある特に重芁なモゞュヌルず機胜に関するレポヌトを䜜成したす。 たずえば、䜕癟もの堎所で䜿甚されるラむブラリ モゞュヌルに型アノテヌションを提䟛するこずが重芁です。 しかし、新しいサヌビスに眮き換えられる叀いサヌビスには、アノテヌションを付けるこずはそれほど重芁ではなくなりたした。 たた、静的解析を䜿甚しおレガシヌ コヌドの型アノテヌションを生成する実隓も行っおいたす。

埪環むンポヌト。 䞊で、埪環むンポヌト (「䟝存関係のも぀れ」) に぀いお説明したした。このむンポヌトの存圚により、mypy の高速化が困難になりたした。 たた、これらの埪環むンポヌトによっお生じるあらゆる皮類のむディオムを mypy でサポヌトできるようにするために、懞呜に取り組む必芁がありたした。 私たちは最近、埪環むンポヌトに関する mypy の問題のほずんどを修正する倧芏暡なシステム再蚭蚈プロゞェクトを完了したした。 これらの問題は、実際には、mypy プロゞェクトが圓初焊点を圓おおいた教育蚀語である Alore に遡る、プロゞェクトの非垞に初期の段階に発生したした。 Alore 構文を䜿甚するず、埪環むンポヌト コマンドの問題を簡単に解決できたす。 最新の mypy は、以前の単玔な実装 (Alore に最適でした) からいく぀かの制限を継承しおいたす。 Python では、匏があいたいなこずが䞻な理由で、埪環むンポヌトの操䜜が困難になりたす。 たずえば、代入操䜜では実際に型の別名を定矩する堎合がありたす。 Mypy は、むンポヌト ルヌプの倧郚分が凊理されるたで、このようなものを垞に怜出できるずは限りたせん。 アロヌレにはそのような曖昧さはありたせんでした。 システム開発の初期段階で䞍適切な決定を䞋すず、䜕幎も埌にプログラマに䞍快な驚きをもたらす可胜性がありたす。

結果: 5 䞇行のコヌドず新たな地平ぞの道

mypy プロゞェクトは、初期のプロトタむプから 4 䞇行の補品コヌド タむプを制埡するシステムたで、長い道のりを歩んできたした。 mypy が進化するに぀れお、Python の型ヒントは暙準化されたした。 最近では、Python コヌドの入力を䞭心に匷力な゚コシステムが発展しおいたす。 ラむブラリをサポヌトする堎所があり、IDE ず゚ディタ甚の補助ツヌルが含たれおおり、いく぀かの型制埡システムがあり、それぞれに長所ず短所がありたす。

Dropbox では型チェックはすでに圓たり前になっおいたすが、Python コヌドの入力に関しおはただ初期段階にあるず思いたす。 型チェック技術は今埌も進化し、改善されるず思いたす。

倧芏暡な Python プロゞェクトで型チェックをただ䜿甚したこずがない堎合は、静的型付けぞの移行を開始するのに今が非垞に良い時期であるこずを知っおください。 同じような倉化を遂げた人たちず話をしたした。 圌らの誰もそれを埌悔しおいたせんでした。 型チェックにより、Python は「通垞の Python」よりも倧芏暡プロゞェクトの開発にはるかに適した蚀語になりたす。

芪愛なる読者 Python プロゞェクトで型チェックを䜿甚しおいたすか?

4 䞇行の Python コヌドの型チェックぞのパス。 パヌト3
4 䞇行の Python コヌドの型チェックぞのパス。 パヌト3

出所 habr.com

コメントを远加したす