コードをクリーンに保つための4つのPython型チェッカー

当初、Pythonには型の装飾がありませんでした。これは、コードの記述の紆余曲折に対応し、開発者がコードを簡潔に保つのに役立つ柔軟なオブジェクトタイプを使用して、言語を高速かつ簡単に操作できるようにするという全体的な目標に適合します。

ただし、過去数年間で、Pythonは型注釈のサポートを追加し、開発中にPythonの型チェックに専念するソフトウェアの文化全体を刺激しました。Pythonは実行時に型をチェックしません—少なくともまだです。しかし、優れたタイプチェッカーを利用して、選択したIDEでショットガンを使用することで、Pythonのタイプ注釈を使用して、本番環境に到達する前に多くの一般的な間違いを排除できます。

この記事では、Python用の4つの主要な型チェックアドオンについて詳しく説明します。すべてがほぼ同じパターンに従い、型アノテーションを使用してPythonコードをスキャンし、フィードバックを提供します。しかし、それぞれが基本概念に独自の便利な追加を提供します。

Mypy

Mypyは、2012年に作業が開始されたため、間違いなくPythonの最初の静的型チェックシステムであり、現在も活発に開発されています。これは本質的に、Pythonでサードパーティの型チェックライブラリがどのように機能するかのプロトタイプです。それ以来、他の多くのライブラリが登場し、その機能が拡張されています。

Mypyは、スタンドアロンで実行することも、コマンドラインから実行することも、エディターまたはIDEのリンター統合の一部として機能させることもできます。多くのエディターとIDEはMypyを統合しています。Visual Studio CodeのPython拡張機能は、直接使用できます。Mypyを実行すると、提供されるタイプ情報に基づいて、コードの整合性に関するレポートが生成されます。

コードに型アノテーションが含まれていない場合、Mypyはコードチェックの大部分を実行しません。ただし、Mypyを使用して、注釈のないコードにフラグを立てることができます。これは、ニーズに応じてさまざまな程度の厳密さで行うことができます。

コードベースを最初から作成していて、先制的に積極的なリンティング戦略が必要な場合は、この--strictオプションを使用して、型指定されていないコードを防ぐことができます。一方、型定義が多くないレガシーコードベースを使用している場合は、型なし関数定義のみを禁止--disallow-untyped-defs し、他の型なしコードを許可するなど、より緩和されたオプションを使用でき ます。また# type: ignore、個々の行にフラグが付けられないようにするために、いつでもインラインコメントを使用できます。

Mypyは、モジュールのパブリックインターフェイスにタイプヒントを使用する場合に、PEP484スタブファイルを利用できます。これに加えて、Mypyはstubgen、既存のコードからスタブファイルを自動的に生成するツールを提供します。型指定されていないコードの場合、スタブファイルはジェネリック型を使用し、必要に応じてマークアップできます。

Pytype

Googleによって作成されたPytypeは、タイプ記述子だけでなく推論を使用するという点でMypyのようなものとは異なります。言い換えると、Pytypeは、型の注釈に厳密に依存するのではなく、コードフローを分析することによって型を判別しようとします。

Pytypeは、そうすることが理にかなっているときはいつでも、寛大さの側で誤りを犯します。実行時に機能し、アノテーションと矛盾しない操作がある場合、Pytypeはそれについてしゃがむことはありません。ただし、これは、フラグを立てる必要のあるいくつかの問題(たとえば、ある時点で型を持つ変数を宣言し、同じコンテキストでそれを再定義する)が予告なしに通過することを意味します。ドキュメントには、そのようなことは将来のある時点で許可されなくなると記載されています。

コードに型注釈を追加することを選択した場合、Pytypeの reveal_type関数は特に便利です。を読み取るステートメントをコードに挿入するとreveal_type(expr)、Pytypeexprはそのタイプを説明するアラートを評価して発行します。 

特定のPytypeの動作は、コード自体に属性を追加することによって制御されることに注意してください。たとえば、動的に設定された属性またはモジュールメンバーの欠落について、Pytypeが文句を言うのを防ぎたい場合は、_HAS_DYNAMIC_ATTRIBUTES = Trueある種のPytype構成メタデータを設定するのではなく、問題のクラスまたはモジュールに属性を追加する必要があります。

Pyright / Pylance

Pyrightは、MicrosoftのPython型チェッカーであり、Visual StudioCodeのPylance拡張機能の一部として含まれています。すでにVSCodeを使用している場合は、Pylance拡張機能がPyrightを操作するための最も便利な方法です。それをインストールして行くだけです。Pyrightは、以前のPython分析ツールと同じ便利さと進歩の多くを備えた、優れたオールインワンの型チェックとコードリンティングエクスペリエンスを提供します。

Pytypeと同様に、Pyrightはタイプ情報を持たないコードベースを処理できます。そのような場合、Pyrightは、どのタイプが使用されているかを推測するために最善を尽くします。したがって、型宣言のない古いコードベースでPytypeを使用しても良好な結果を得ることができます。ただし、コードに型アノテーションを段階的に追加すると、時間の経過とともにより良い結果が得られます。

Pyrightは、実際のP​​ythonプロジェクトの設計を補完する方法で非常に柔軟性があります。他のタイプチェッカーと同様に、Pyrightは、プロジェクトのディレクトリにあるJSON形式の構成ファイルを使用してプロジェクトごとに構成できます。個々のパスは、構成ファイルで除外(チェックしない)または無視(エラーと警告の抑制)することができ、オプションは非常にきめ細かくなります。

VS Codeでは、プロジェクトのさまざまな部分でさまざまなリンティング構成が必要な場合に備えて、複数のルートを持つワークスペースにそれぞれ独自のPyright構成を設定できます。同様に、プロジェクト内に複数の「実行環境」を定義でき、それぞれに独自のvenvパスまたはインポートパスがあります。

パイア 

FacebookとInstagramの開発者によって作成されたPyreは、実際には、タイプチェッカー(Pyre)と静的コード分析ツール(Pysa)の2つのツールを1つにまとめたものです。この2つは連携して動作するように設計されており、他のツールよりも高いレベルのチェックと分析を提供しますが、ユーザーはこれらを最大限に活用するために少し手間をかける必要があります。

Pyreは、PytypeやMypyと同様のアプローチを採用しています。型なしコードは型付きコードよりも寛大に処理されるため、型なしPythonコードベースから始めて、関数ごとおよびモジュールごとに注釈を追加できます。モジュールで「厳密モード」をオンに切り替えると、Pyreは欠落している注釈にフラグを立てます。または、strictモードをデフォルトにして、モジュールレベルでオプトアウトすることもできます。Pyreは、.pyi形式のスタブファイルでも機能します。

Pyreには、コードベースを型付き形式に移行するための強力な機能があります。inferコマンドラインオプションは、ファイルやディレクトリを摂取使用タイプについての教育を受けた推測をしますし、ファイルに注釈を適用します。ただし、最初にコードのバックアップを作成することをお勧めします。 (実行中のPythonプログラムから型情報を取得する場合は、別のFacebook / InstagramプロジェクトであるMonkeyTypeを使用して取得できます。)

Pyreの機能は、ここで詳しく説明する他のパッケージの機能と同じですが、Pysaはユニークです。Pysaは、コードに対して「汚染分析」を実行して、潜在的なセキュリティ問題を特定します。特定のソフトウェアコンポーネントのフロー分析のライブラリに依存し、脆弱と思われるコードにフラグを付けます。データをサニタイズし、そのデータを汚染グラフから削除するコンポーネントを指定することはできますが、そのコードが触れたものはすべて汚染済みとしてフラグが立てられます。

1つの欠点は、サードパーティコンポーネントの汚染分析のPysaのライブラリがまだ小さいため、独自のモデルを考案する必要がある場合があることです。ただし、汚染分析の多くは、一般的なファイルシステムの問題の分析は言うまでもなく、Django Webフレームワーク、SQL Alchemy ORM、Pandasデータサイエンスライブラリなど、広く使用されているソフトウェアを対象としています。

Pythonでさらに多くのことを行う方法

  • Pythonリストデータ型を操作する方法
  • BeeWareブリーフケースでPythonアプリをパッケージ化する方法
  • Anacondaを他のPythonと並べて実行する方法
  • Pythonデータクラスの使用方法
  • Pythonで非同期を始めましょう
  • Pythonでasyncioを使用する方法
  • Python非同期オーバーホールへの3つのステップ
  • PyInstallerを使用してPython実行可能ファイルを作成する方法
  • Cythonチュートリアル:Pythonを高速化する方法
  • Pythonをスマートにインストールする方法
  • PoetryでPythonプロジェクトを管理する方法
  • PipenvでPythonプロジェクトを管理する方法
  • Virtualenvとvenv:Python仮想環境の説明
  • Pythonvirtualenvとvenvはすべきこととすべきでないこと
  • Pythonのスレッド化とサブプロセスの説明
  • Pythonデバッガーの使用方法
  • timeitを使用してPythonコードをプロファイリングする方法
  • cProfileを使用してPythonコードをプロファイリングする方法
  • PythonをJavaScriptに変換する方法(そしてまた元に戻す方法)