What is the correct type hint for x = []
?
The type checker in my PyCharm editor flagged this as an error:
labelframes: List[ttk.LabelFrame] = []
'Optional' is not an option as in:
labelframes: List[Optional[ttk.LabelFrame]] = []
because the documentation for typing.Optional
states that this is equivalent to:
labelframes: List[Union[ttk.LabelFrame, None]] = []
and [None]
is not []
.
I ought to mention that PyCharm doesn't like this either:
labelframes: List[Union[ttk.LabelFrame, None]] = [None]
Whatever type hint I try. PyCharm flags it as an error with,
"Expected to return my type hint here, got no return," so I tried:
labelframes: Optional[List[ttk.LabelFrame, None]] = []
That didn't work.
I am aware that PEP 526 has numerous examples which follow the pattern:
x: List[str] = []
Looking at PEP 484, specifically the section on type comments (the precursor to variable annotations) this does indeed seem like a bug with PyCharm's checker.
Quoting from the PEP:
In non-stub code, there is a similar special case:
from typing import IO
stream = None # type: IO[str]
Type checkers should not complain about this (despite the value None
not matching the given type), nor should they change the inferred type to Optional[...]
(despite the rule that does this for annotated arguments with a default value of None ). The assumption here is that other code will ensure that the variable is given a value of the proper type, and all uses can assume that the variable has the given type.
So, in a similar fashion, type-checkers (as mypy
currently does), should not complain about the fact that the initializing value you provide doesn't strictly match the annotation.