Python 3.5。のタイプヒントを使用して練習しています。同僚の1人がtyping.Dict
:
import typing
def change_bandwidths(new_bandwidths: typing.Dict,
user_id: int,
user_name: str) -> bool:
print(new_bandwidths, user_id, user_name)
return False
def my_change_bandwidths(new_bandwidths: dict,
user_id: int,
user_name: str) ->bool:
print(new_bandwidths, user_id, user_name)
return True
def main():
my_id, my_name = 23, "Tiras"
simple_dict = {"Hello": "Moon"}
change_bandwidths(simple_dict, my_id, my_name)
new_dict = {"new": "energy source"}
my_change_bandwidths(new_dict, my_id, my_name)
if __== "__main__":
main()
どちらも正常に機能し、違いはないようです。
typing
モジュールのドキュメント を読みました。
の間に typing.Dict
またはdict
どちらをプログラムで使用する必要がありますか?
プレーンtyping.Dict
とdict
を使用しても、実際の違いはありません。
ただし、typing.Dict
は Generic type であり、キーと値のタイプを指定できますtoo、より柔軟に:
def change_bandwidths(new_bandwidths: typing.Dict[str, str],
user_id: int,
user_name: str) -> bool:
そのため、プロジェクトの存続期間のある時点で辞書引数をもう少し正確に定義したい場合があります。その時点でtyping.Dict
をtyping.Dict[key_type, value_type]
に拡張すると、置換よりも「小さな」変更になりますdict
。
ここで Mapping
または MutableMapping
タイプを使用することにより、これをさらに汎用的にすることができます。関数はマッピングをalterする必要がないため、Mapping
を使い続けます。 dict
はマッピングの1つですが、マッピングインターフェイスを満たす他のオブジェクトを作成することもできますが、関数はこれらのオブジェクトでも機能する可能性があります。
def change_bandwidths(new_bandwidths: typing.Mapping[str, str],
user_id: int,
user_name: str) -> bool:
これで、この関数の他のユーザーに、コードが実際にalter渡されないnew_bandwidths
マッピングではないことを明確に伝えています。
実際の実装では、単に印刷可能なオブジェクトを想定しています。これはテストの実装かもしれませんが、new_bandwidths: typing.Any
を使用した場合、コードは引き続き機能します。Pythonのオブジェクトはすべて印刷可能です。
_typing.Dict
_ はdict
の汎用バージョンです:
class typing.Dict(dict, MutableMapping[KT, VT])
Dictの汎用バージョン。このタイプの使用法は次のとおりです。
_def get_position_in_index(Word_list: Dict[str, int], Word: str) -> int: return Word_list[Word]
_
ここで、dictでキーと値のタイプを指定できます:_Dict[str, int]
_