私はpython 3.6とフラスコを使用しています。フラスコにmysqldbを使用してmysqlに接続しました。ただし、プログラムでmypyを実行しようとすると、次のエラーが発生します: 'flask_mysqldb'の分析をスキップしています:見つかったモジュールしかし、タイプヒントまたはライブラリスタブはありません。フラグignore-missing-importsまたはfollow-imports = skipを使用してmypyを実行してみました。その後、エラーが発生しませんでした。なぜこのエラーが発生するのですか?何も追加せずにこれを修正するにはどうすればよいですか?追加のフラグ?
Mypyは、インポートしようとするすべてのモジュールを型チェックするように設計されていないため、このエラーが発生します。これには主に3つの理由があります。
インポートしようとしているモジュールは、タイプチェックに失敗するように記述されている可能性があります。たとえば、モジュールがグローバルスコープでmy_list = []
のような処理を行う場合、mypyはこのリストに何が含まれるかがわからないため、型のヒントを要求します。
これらの種類のエラーは、ライブラリを使用している人々の管理外にあります。そのため、どこにでもそれらをスパムする可能性があることは煩わしく、破壊的です。
タイプチェックをきれいにインポートしようとしているライブラリモジュールがタイプヒントを使用していない場合でも、mypyで使用しようとしてもあまりメリットはありません。ライブラリが動的に型付けされている場合、mypyは実行時に実際に型チェックを行わないコードを黙って受け入れる可能性があります。
これは人々に驚くかもしれません/静かに間違ったことをすることは一般的に悪い考えです。代わりに、明示的な警告が表示されます。
すべてのモジュールがPythonで記述されているわけではありません-一部のモジュールは実際にはC拡張です。Mypyはこれらのモジュールを分析できないため、モジュールを無視するための何らかのメカニズムを実装する必要があります。
このエラーが発生するしない場合、これは次の5つのいずれかを意味します。
ライブラリのタイプヒントは、mypyにあらかじめバンドルされている Typeshed にすでに存在します。 Typeshedには主に、標準ライブラリと少数の人気のあるサードパーティライブラリの型ヒントが含まれています。
ライブラリはすでに型ヒントを使用しており、mypyによる分析と型チェックが必要であることを宣言しています。これは、パッケージ内に特別なpy.typed
ファイルを含めることで行われます PEP 561互換 。
サードパーティの「スタブのみ」のパッケージをインストールしました。このパッケージはライブラリと一緒にインストールでき、ライブラリ自体を変更せずにタイプヒントを提供できます。たとえば、 Django-stubs パッケージには、Djangoライブラリのタイプヒントが含まれていますが、これはPEP 561互換ではありません。
独自のカスタムスタブを使用するようにmypyを構成しました。つまり、基本的にローカルの「スタブのみ」のパッケージを作成し、mypyにそれを使用するように指示しました。
エラーを抑制し、ライブラリが今のところ動的に型付けされているという事実を受け入れることにしました。たとえば、見つけたコマンドラインフラグを使用するか、# type: ignore
をインポートに追加します。
このエラーに対処する方法の詳細については、 サードパーティライブラリの不足しているタイプヒントの処理に関するmypyドキュメント を参照してください。