What is the correct type hint for an empty list?

十年热恋 提交于 2019-12-02 00:45:07

问题


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] = []

回答1:


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.



来源:https://stackoverflow.com/questions/45264194/what-is-the-correct-type-hint-for-an-empty-list

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!