181

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 __name__ == "__main__":
    main()

どちらも問題なく動作し、違いはないようです。

typingモジュールのドキュメントを読みました。

プログラムでtyping.Dictどちらdictを使用する必要がありますか?

4

3 に答える 3

240

typing.Dictプレーンを使用することと、いいえを使用することの間に実際の違いはありdictません。

ただし、typing.Dictこれはジェネリック タイプ *であり、キーと値のタイプも指定できるためより柔軟になります。

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ここでorMutableMapping型を使用すると、これをさらに一般的にすることができます。あなたの関数はマッピングを変更する必要がないので、私はMapping. Adictは 1 つのマッピングですが、マッピング インターフェイスを満たす他のオブジェクトを作成することもできます。関数はそれらのオブジェクトでも動作する可能性があります。

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

これで、この関数の他のユーザーに、コードが渡されたマッピングを実際に変更しないことを明確に伝えています。new_bandwidths

実際の実装は、印刷可能なオブジェクトを期待しているだけです。new_bandwidths: typing.Anyこれはテスト実装かもしれませんが、現状では、Python のオブジェクトはすべて印刷可能であるため、を使用してもコードは引き続き機能します。


* : 注: Python 3.7 以降を使用dictしている場合は、モジュールをfrom __future__ import annotationsで開始するとジェネリック型として使用できます。Python 3.9 の時点ではdict(他の標準コンテナーと同様に)、それがなくてもジェネリック型として使用することがサポートされています。ディレクティブ

于 2016-05-07T10:45:42.147 に答える
36

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[str, int]

于 2016-05-07T10:46:43.343 に答える