Use of colon ':' in type hints

When type annotating a variable of type dict, typically you'd annotate it like this:

numeralToInteger: dict[str, int] = {...}

However I rewrote this using a colon instead of a comma:

numeralToInteger: dict[str : int] = {...}

And this also works, no SyntaxError or NameError is raised.

Upon inspecting the __annotations__ global variable:

colon: dict[str : int] = {...}
comma: dict[str, int] = {...}

print(__annotations__)

The output is:

{'colon': dict[slice(<class 'str'>, <class 'int'>, None)],
 'comma': dict[str, int]}

So the colon gets treated as a slice object and the comma as a normal type hint.

Should I use the colon with dict types or should I stick with using a comma?

I am using Python version 3.10.1.


If you have a dictionary whose keys are strings and values are integers, you should do dict[str, int]. It's not optional. IDEs and type-checkers use these type hints to help you. When you say dict[str : int], it is a slice object. Totally different things.

Try these in mypy playground:

d: dict[str, int]
d = {'hi': 20}

c: dict[str: int]
c = {'hi': 20}

message:

main.py:4: error: "dict" expects 2 type arguments, but 1 given
main.py:4: error: Invalid type comment or annotation
main.py:4: note: did you mean to use ',' instead of ':' ?
Found 2 errors in 1 file (checked 1 source file)

Error messages are telling everything


With dict[str:int] the hint you are passing is dict whose keys are slices, because x:y is a slice in python.

The dict[str, int] passes the correct key and value hints, previously there also was a typing.Dict but it has been deprecated.