this post was submitted on 26 Sep 2023
20 points (100.0% liked)

Python

6360 readers
12 users here now

Welcome to the Python community on the programming.dev Lemmy instance!

πŸ“… Events

PastNovember 2023

October 2023

July 2023

August 2023

September 2023

🐍 Python project:
πŸ’“ Python Community:
✨ Python Ecosystem:
🌌 Fediverse
Communities
Projects
Feeds

founded 1 year ago
MODERATORS
 

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

top 8 comments
sorted by: hot top controversial new old

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.

[–] o11c@programming.dev 5 points 1 year ago (1 children)

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)

[–] meadsteve@reddthat.com 2 points 1 year ago

Yeah there's definitely a lot of room for improvement here

[–] jadelord@discuss.tchncs.de 4 points 1 year 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].

[–] coffeewithalex@lemmy.world 3 points 1 year ago (1 children)

The important difference is that you don't need to import anything in order to quickly use list type. This wins in the majority of the cases, unless I'm building something that will be imported by multiple other modules and it really pays to be that explicit.

[–] meadsteve@reddthat.com 2 points 1 year ago

That was definitely a nice feature (I forget exactly when list over List was added). That said I've never really been bothered about having imports. Especially when I know the import is side effect free like the typing module. But I definitely use import free list for script files without many lines of code.

[–] chemacortes@programming.dev 3 points 1 year ago (1 children)

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 2 points 1 year 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