Python's efficient key/value hash table structure is called a "dict". The contents of a dict can be written as a series of key:value pairs within braces { }, e.g. dict = {key1:value1, key2:value2, ... }.
A TypedDict type represents dictionary objects with a specific set of string keys, and with specific value types for each valid key. Each string key can be either required (it must be present) or non-required (it doesn't need to exist).
With CPython 2.7, using dict() to create dictionaries takes up to 6 times longer and involves more memory allocation operations than the literal syntax. Use {} to create dictionaries, especially if you are pre-populating them, unless the literal syntax does not work for your case.
The dict() function creates a dictionary. A dictionary is a collection which is unordered, changeable and indexed.
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.
*: Note: If you are using Python 3.7 or newer, you can use dict
as a generic type if you start your module with from __future__ import annotations
, and as of Python 3.9, dict
(as well as other standard containers) supports being used as generic type even without that directive.
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]
as said in python org:
class typing.Dict(dict, MutableMapping[KT, VT])
A generic version of dict. Useful for annotating return types. To annotate arguments it is preferred to use an abstract collection type such as Mapping.
This type can be used as follows:
def count_words(text: str) -> Dict[str, int]:
...
But dict
is less general and you will be able to alter the mapping passed in.
In fact, in python.Dict
you specify more details.
Another tip:
Deprecated since version 3.9: builtins.dict now supports []. See PEP 585 and Generic Alias Type.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With