What is the correct type hint for an empty list?

10,166

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.

Share:
10,166
lemi57ssss
Author by

lemi57ssss

I'm retired after spending most of my working life in IT although the last time anybody paid me to code was in the mid 90's. At one time or another I used Z80 Assembler, MS Basic, Fortran, COBOL, Filetab, RPG II, INFO(PR1ME), Pascal, Object Pascal, 4th Dimension, C, C++, MS Access, SQL, Mapper, and Dreamweaver. I'm back for a couple of reasons. I was frustrated by my inability to find an off the shelf home accounting program that did anything close to what I wanted. Also, I was curious to see in what ways fourth generation languages had developed into their fifth and sixth generations. Well, that was a surprise. But I did find Python and that made me happy.

Updated on June 19, 2022

Comments

  • lemi57ssss
    lemi57ssss about 2 years

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