Difference between defining typing.Dict and dict?

后端 未结 2 1001
臣服心动
臣服心动 2020-12-07 18:52

I am practicing using type hints in Python 3.5. One of my colleague uses typing.Dict:

import typing


def change_bandwidths(new_bandwidths: typi         


        
相关标签:
2条回答
  • 2020-12-07 19:15

    typing.Dict is a generic version of dict:

    class typing.Dict(dict, MutableMapping[KT, VT])

    A generic version of dict. The usage of this type is as follows:

    def get_position_in_index(word_list: Dict[str, int], word: str) -> int:
         return word_list[word]
    

    Here you can specify the type of key and values in the dict: Dict[str, int]

    0 讨论(0)
  • 2020-12-07 19:19

    There is no real difference between using a plain typing.Dict and dict, no.

    However, typing.Dict is a Generic type that lets you specify the type of the keys and values too, making it more flexible:

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

    As such, it could well be that at some point in your project lifetime you want to define the dictionary argument a little more precisely, at which point expanding typing.Dict to typing.Dict[key_type, value_type] is a 'smaller' change than replacing dict.

    You can make this even more generic by using Mapping or MutableMapping types here; since your function doesn't need to alter the mapping, I'd stick with Mapping. A dict is one mapping, but you could create other objects that also satisfy the mapping interface, and your function might well still work with those:

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

    Now you are clearly telling other users of this function that your code won't actually alter the new_bandwidths mapping passed in.

    Your actual implementation is merely expecting an object that is printable. That may be a test implementation, but as it stands your code would continue to work if you used new_bandwidths: typing.Any, because any object in Python is printable.

    0 讨论(0)
提交回复
热议问题