他の回答は、アヒルのタイピングとtzotによる簡単な回答を説明するのに優れています。
Pythonには、変数が型と値を持つ他の言語のように、変数はありません。タイプを知っているオブジェクトを指す名前が付けられています。
ただし、2010年以降(質問が最初に質問されたとき)興味深い変更が1つあります。それは、PEP 3107(Python 3で実装)の実装です。次のように、実際にパラメータのタイプと関数の戻り値のタイプを指定できます。
def pick(l: list, index: int) -> int:
return l[index]
ここではpick
、リストl
と整数の2つのパラメーターを受け取ることがわかりますindex
。また、整数を返す必要があります。
したがって、ここではl
、それが多くの努力なしで見ることができる整数のリストであることを暗示していますが、より複雑な関数の場合、リストに何を含める必要があるかについて少し混乱する可能性があります。また、のデフォルト値をindex
0にする必要があります。これを解決するにはpick
、代わりに次のように記述します。
def pick(l: "list of ints", index: int = 0) -> int:
return l[index]
ここでは、のタイプとして文字列を入れていますがl
、これは構文的には許可されていますが、プログラムによる解析には適していません(これについては後で説明します)。
Pythonが提起しないことに注意することが重要であるTypeError
あなたにフロートを渡した場合index
、この理由は、Pythonの設計哲学の主なポイントの一つである、:「我々は、すべてここに同意成人している」あなたがすることが期待されている手段、関数に渡すことができるものとできないものに注意してください。TypeErrorsをスローするコードを本当に作成したい場合は、isinstance
関数を使用して、渡された引数が次のように適切なタイプまたはそのサブクラスであることを確認できます。
def pick(l: list, index: int = 0) -> int:
if not isinstance(l, list):
raise TypeError
return l[index]
あなたがめったにこれをするべきではない理由と、代わりに何をすべきかについての詳細は、次のセクションとコメントで説明されています。
PEP 3107はコードの読みやすさを向上させるだけでなく、ここで読むことができるいくつかの適切な使用例もあります。
型注釈は、型ヒントの標準モジュールを導入するPEP 484の導入により、Python 3.5でより多くの注目を集めました。
これらの型ヒントは、現在PEP 484に準拠している型チェッカーmypy(GitHub)からのものです。
型付けモジュールには、次のような型のヒントのかなり包括的なコレクションが付属しています。
List
、Tuple
、Set
、Map
-のためにlist
、tuple
、set
およびmap
それぞれ。
Iterable
-発電機に便利です。
Any
-それが何かであるとき。
Union
-とは対照的に、指定されたタイプのセット内の何かである可能性がある場合Any
。
Optional
-ときそれは可能性が Noneに。の略記Union[T, None]
。
TypeVar
-ジェネリックで使用されます。
Callable
-主に関数に使用されますが、他の呼び出し可能オブジェクトにも使用できます。
これらは最も一般的な型のヒントです。完全なリストは入力モジュールのドキュメントにあります。
これは、型付けモジュールで導入されたアノテーションメソッドを使用した古い例です。
from typing import List
def pick(l: List[int], index: int) -> int:
return l[index]
強力な機能の1つは、Callable
関数を引数として取るアノテーションメソッドを入力できることです。例えば:
from typing import Callable, Any, Iterable
def imap(f: Callable[[Any], Any], l: Iterable[Any]) -> List[Any]:
"""An immediate version of map, don't pass it any infinite iterables!"""
return list(map(f, l))
上記の例は、のTypeVar
代わりにを使用するとより正確になる可能性がありAny
ますが、タイプヒントによって有効化されたすばらしい新機能に関する情報が多すぎてすでに回答が埋まっていると思うので、これは読者への課題として残しました。
以前は、たとえばSphinxなどのドキュメント化されたPythonコードの場合、上記の機能の一部は、次のような形式のdocstringを記述することで取得できました。
def pick(l, index):
"""
:param l: list of integers
:type l: list
:param index: index at which to pick an integer from *l*
:type index: int
:returns: integer at *index* in *l*
:rtype: int
"""
return l[index]
ご覧のように、これは追加の行数を必要とします(正確な数は、どの程度明示的になりたいか、およびdocstringのフォーマット方法によって異なります)。しかし、PEP 3107が多くの(すべての)方法で優れた代替手段を提供する方法が明らかになったはずです。これは、PEP 484と組み合わせた場合に特に当てはまります。これは、これまで見てきたように、これらのタイプのヒント/注釈の構文を定義する標準モジュールを提供します。強力な組み合わせ。
私の個人的な意見では、これはPythonの最大の機能の1つです。私は人々がそれの力を利用し始めるのを待つことができません。長い答えで申し訳ありませんが、これは私が興奮したときに起こることです。
型ヒントを多用するPythonコードの例は、こちらにあります。