web-dev-qa-db-ja.com

python 3.6で型ヒントを使用する方法?

python 3.5およびpython 3.6は静的型チェックに関する多くの機能を追加したので、次のコードで試してみました(python 3.6、安定バージョン)。

from typing import List

a: List[str] = []
a.append('a')
a.append(1)
print(a)

私が驚いたのは、pythonがエラーや警告を出さなかったが、1は、文字列のみを含むlistに追加されました。 Pycharmはタイプエラーを検出し、それについて警告を表示しましたが、それは明らかではなく、出力コンソールに表示されませんでした。次の効果が欲しい:

  1. 上記のように間違ったタイプを使用したことが明らかな場合は、警告またはエラーをスローします。
  2. コンパイラが、使用した型が正しいか間違っているかを確実に確認できなかった場合、無視してください。

それは可能ですか?おそらくmypyでもできますが、python-3.6スタイルの型チェック(a: List[str])コメントスタイルの代わりに(# type List[str]mypyで使用されます。そして、先ほど言った2つのポイントを達成するために、ネイティブpython 3.6にスイッチがあるかどうか、興味があります。

38
Searene

タイプヒントは、Pythonランタイムによって無視されることを完全に意図しており、mypyやPycharmの統合チェッカーなどのサードパーティツールによってのみチェックされます。型注釈を使用してコンパイル時または実行時に型チェックを行いますが、ほとんどの人はmypyまたはPycharmの統合チェッカーAFAIKを使用します。

実際、タイプチェックがPython将来的には適切なものに統合されることを疑います。 PEP 484 (これは、型注釈を導入)および PEP 526 (変数注釈を導入)、およびGuidoのコメント ここ

私は個人的に型チェックがPythonとより強力に統合されていることに満足していますが、Pythonコミュニティ全体がそのような変更を準備している、または喜んでいるようには見えません。

Mypyの最新バージョンは、Python 3.6変数注釈構文とコメントスタイル構文の両方を理解する必要があります。実際、変数注釈は基本的に最初はGuidoのアイデアでした(Guidoは現在、 mypyチーム)-基本的に、mypyとPython=での型注釈のサポートはほとんど同時に開発されました。

29
Michael0x2a

Pythonのタイプアノテーションは、タイプを強制するためのものではありません。実行時の静的タイプの依存関係を含むものは、結果の言語を "Python" 。

Pythonの動的な性質により、pure-pythonコードを使用して外部ツールを構築し、ランタイムタイプチェックを実行することができます。プログラムの実行は非常に遅くなりますが、特定のテストカテゴリに適している可能性があります。

確かに-Python言語の基本の1つは、すべてがオブジェクトであり、実行時にオブジェクトに対して任意のアクションを実行できることです。オブジェクトが試行された操作に準拠するインターフェースは、実行時に失敗します。

本質的に静的に型指定された言語は、別の方法で機能します。実行時に試行された場合、オブジェクトで操作を使用できるようにする必要があります。コンパイルのステップで、コンパイラは場所全体に適切なオブジェクトのスペースとスロットを作成します-そして、不適合の型付けでは、コンパイルを中断します。

Pythonの型チェックにより、任意の数のツールで正確にそれを行うことができます。実際にアプリケーションを実行する前のステップでブレークし、警告します(ただし、コンパイル自体には依存しません)。しかし、実行時にオブジェクトが実際に準拠することを要求するために、言語の性質を変更することはできません-コンパイルステップでのタイピングとブレーク自体を人工化することは人為的です。

ただし、Pythonの将来のバージョンでは、Pythonランタイム自体-オプションのコマンドラインスイッチを介して、ほとんどの場合、コンパイル時の型チェックを組み込む可能性があります。私はそれがデフォルトになることはないと思います-少なくともビルドを壊さないために-多分それは警告を出すためにデフォルトにすることができます)

したがって、PythonはPythonでなくなるので、実行時に静的型チェックを必要としません。しかし、動的オブジェクトと静的型付けの両方を使用する少なくとも1つの言語-Cython言語、実際にはPythonスーパーセットとして機能します。 Cython は、すぐに実際の型宣言となる新しい型ヒント構文を組み込むことを期待する必要があります。オプションの静的に型指定された変数の異なる構文)

8
jsbueno