私は 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
。 はdict
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
(および他の標準コンテナ)そのディレクティブがなくてもジェネリック型として使用されることをサポートします。