A blog post on choosing more specific types rather than general ones like list and dict.

  • o11c@programming.dev
    ·
    9 months ago

    The problem is that there's a severe hole in the ABCs: there is no distinction between "container whose elements are mutable" and "container whose elements and size are mutable".

    (related, there's no distinction for supporting slice operations or not, e.g. deque)

  • qwertyasdef@programming.dev
    ·
    9 months ago

    If you don't need to reuse the collection or access its items out of order, you can also use Iterable which accepts even more inputs like generators.

  • jadelord@discuss.tchncs.de
    ·
    9 months ago

    Good point, and Łukasz Langa mentioned this in his talk (check it out). He names it the robustness principle, in his words (around 22:20 mark:

    "Vague in what you accept, concrete in what you return"

    But he also mentions some gotchas like how Iterable[str] can backfire, because str is also an Iterable[str] and it might be better to use list[str].

  • chemacortes@programming.dev
    ·
    9 months ago

    Sequence now lives at collections.abc. BTW, float is not a supertype of int (issubclass(int, float) == False). Normaly, It is acceptable to use int instead of float, but speaking of variance, it is more precise to use numbers.Real:

    issubclass(Integral, Real) == True
    issubclass(int, Real) == True
    issubclass(float, Real) == True
    issubclass(complex, Real) == False
    
    • MeadSteve@reddthat.com
      hexagon
      ·
      9 months ago

      yeah it's an interesting case that an int can be treated as a float. I should probably update my post to mention that it's not strictly a supertype but a special exception mentioned in python's typehinting pep: https://peps.python.org/pep-0484/#the-numeric-tower