Typing.Dictとdictの定義の違いは?質問する

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

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

私は読んだtypingモジュールドキュメント

プログラムではどちらを使用すればよいでしょうかtyping.Dict?dict

ベストアンサー1

プレーン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またはMutableMappingここでは 型を使用します。関数はマッピングを変更する必要がないため、 を使用しますMapping。 はdict1 つのマッピングですが、マッピング インターフェイスも満たす他のオブジェクトを作成することもできます。関数はそれらのオブジェクトでも正常に機能する可能性があります。

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

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

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


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

おすすめ記事