1. ホーム
  2. python

[解決済み] typing.Dictとdictの定義の違い?

2022-03-07 10:10:46

質問

Python 3.5で型ヒントを使う練習をしています。私の同僚の一人は 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 プログラムではどちらを使うべきでしょうか?

どのように解決するのですか?

を使用するのとでは、実質的な差はありません。 typing.Dictdict は、ありません。

しかし 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 . A dict は一つのマッピングですが、マッピングのインターフェイスを満たす他のオブジェクトを作成することもできますし、関数もそれらで動作する可能性があります。

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

これで、この関数を使う他のユーザーに対して、あなたのコードが実際には 変更する その new_bandwidths のマッピングが渡されます。

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


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