2017-02-25 4 views
1

私はなぜ型の注釈をPythonで使うべきかを理解しようとしています。 なぜPythonで型を使用するのですか3.5 +

some_function(1, 2) # return 3, type int 

しかし、私はexemple

some_function(1, 2.0) # return 3.0, type float 

のために実行したとき、私はどんなことなく、結果している:私はint型とそれを使用すると、すべてが良い行っ

def some_function(a: int, b: int) -> int: 
    return a + b 

:exempleのために私は次のように関数を記述することができますタイプが間違っていることに注意してください。したがって、型の注釈を使用する理由は何ですか?

+0

タイプヒントは実行時に強制されません。プロジェクトで 'mypy'を実行して、' some_function() 'を間違って使用していることを伝えてください。 –

+0

IDEサポート.... –

答えて

3

タイプヒントはの他のツールのコードをチェックするために実行時に強制されません。目標は、静的解析ツールが無効な引数の使用を検出できるようにすることです。

PyCharmやcommandline code checker mypyのようなIDEを使用すると、2.0は有効な引数の型ではないことがわかります。 Type Hinting PEP (484)から

このPEPは、一部では、おそらく(簡単に 静的解析にPythonコードを開くと、潜在的な実行時の型チェックを、リファクタリングして、型注釈のための標準的な構文を提供することを目的と

タイプ情報を利用したコンテキスト生成)

強調鉱山。実行時の型チェックはサードパーティ製のツールに委ねられています。このようなランタイムチェックにはパフォーマンスの低下が伴うことに注意してください。コールごとにタイプをチェックすると、コードが遅く実行される可能性があります。

+0

ありがとうございます。もう1つ追加するだけで、コード内で使用することをお勧めしますか? –

+0

@OleksandrDashkov:絶対に!大規模プロジェクトでの作業をより簡単にし、エラーを減らすためにFacebookで使用しています。 –

+0

簡単な質問、それらをスタブで供給しているのですか、ソースファイルに直接追加していますか? –

1

1はPEP 484 that introduces type hintsで読むことができたよう:このPEPは、型注釈のための標準的な構文を提供することを目的とし、へ 開放Pythonコードを簡単に静的

(...)

潜在的ランタイム・タイプ・チェック、および(おそらく、いくつかのコンテキストにおいて)コード 世代利用タイプ情報

これらの目標のうち、静的解析が最も重要です。これは、オフライン型ようmypyとしてチェッカー、ならびに コード補完と リファクタリングためのIDEで使用することができる標準的な表記法を提供する サポートを含みます。

IDEの(静的解析)

だから、主な用途は、静的解析である:関数を呼び出すと、あなたが呼び出すことができる機能のリストを提供することができたときに、あなたのIDEには、何かが間違っていることを検出することができます関数の結果

some_function(1,2).real 

とあなたが書く場合:

例えば

あなたが書いた場合:あなたは簡単に書くことができるように

some_function(1,2). 

あなたのIDEは、可能なオプションとしてrealでリストを提供することができます

some_function('foo',2).bar 

'foo'は受け入れ可能なパラメータでもない.barそのオブジェクトに対する適切な呼び出し。

ダイナミック検査

また同じようinspect.getfulargspecでダイナミックな検査のためにそれを使用することができます。今、私たちはsome_functionintを返し、2 int秒feededことができることを知っている

>>> import inspect 
>>> inspect.getfullargspec(some_function).annotations 
{'return': <class 'int'>, 'a': <class 'int'>, 'b': <class 'int'>} 

任意のテスト(これはHaskellで一般的です)に使用できます。some_functionの乱数を送り、常にintを返します(例外として例外は発生しません)。

関連する問題