web-dev-qa-db-ja.com

タイピングの定義の違い.Dictとdict?

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どちらをプログラムで使用する必要がありますか?

44
Sarit

プレーンtyping.Dictdictを使用しても、実際の違いはありません。

ただし、typing.DictGeneric type であり、キーと値のタイプを指定できますtoo、より柔軟に:

def change_bandwidths(new_bandwidths: typing.Dict[str, str],
                      user_id: int,
                      user_name: str) -> bool:

そのため、プロジェクトの存続期間のある時点で辞書引数をもう少し正確に定義したい場合があります。その時点でtyping.Dicttyping.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のオブジェクトはすべて印刷可能です。

65
Martijn Pieters

_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]_

14
AKS