this post was submitted on 02 Nov 2024
269 points (98.2% liked)

Python

7707 readers
1 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 2 years ago
MODERATORS
you are viewing a single comment's thread
view the rest of the comments
[–] bjornsno@lemm.ee 65 points 1 year ago (5 children)

I code both typescript and python professionally, and python is almost as much of a mess, just a different kind of mess. The package manager ecosystem is all over the place, nobody is agreeing on a build system, and the type system is still unable to represent fairly simple concepts when it comes to function typing. Also tons of libraries just ignore types altogether. I love it, but as a competitor to JavaScript in the messiness department it's not a good horse.

[–] legion02@lemmy.world 15 points 1 year ago* (last edited 1 year ago) (1 children)

They ignore types all together because typing is optional in python.

[–] bjornsno@lemm.ee 13 points 1 year ago (1 children)

All documentation is optional and ignored at runtime, that doesn't mean you shouldn't do it. If your library doesn't have type hints I'm just not gonna use it, I don't have the time to figure out what you accept or return.

[–] legion02@lemmy.world -2 points 1 year ago (1 children)

It means they have the option to do it or not do it and you have the option to not use it, which clearly your exercising. I've personally never had a situation where a lack of type hints slowed me down even a little.

[–] FizzyOrange@programming.dev 6 points 1 year ago (1 children)

I dunno if you're being deliberately obtuse, but just in case you really did miss his point: the fact that type hints are optional (and not especially popular) means many libraries don't have them. It's much more painful to use a library without type hints because you lose all of their many benefits.

This obviously isn't a problem in languages that require static types (Go, Rust, Java, etc..) and it isn't a problem with Typescript because static types are far more popular in JavaScript/Typescript land so it's fairly rare to run into a library that doesn't have them.

And yeah you can just not use the library at all but that's just ignoring the problem.

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

True, but if you're looking at a Python library that doesn't have type hints in 2024, then chances are that it's not very good and/or not very well maintained.

Well, indeed. Unfortunately there are still a fair number of them. The situation is definitely improving at least.

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

types are always ignored at runtime, they're only useful when developing

[–] bjornsno@lemm.ee 6 points 1 year ago (2 children)

Yeah, they're useful when developing, which is why it's so frustrating when libraries don't implement types. I'm developing and I'm trying to use a tool that supposedly fits a use case I have, but the tool didn't come with instructions so it's practically useless to me. I could open the tool up and look at its guts to figure it out but are you kidding me no, I'm not going back to the stone age for your tool.

[–] eager_eagle@lemmy.world 3 points 1 year ago* (last edited 1 year ago)

basically sums up the opencv experience in Python.

great lib, very mediocre Python wrapper.

Check if there's a stub or types extension - https://pypi.org/search/?q=types

[–] dallen@programming.dev 1 points 1 year ago

Pydantic offers awesome runtime validation (using Rust).

[–] jjjalljs@ttrpg.network 2 points 1 year ago (1 children)

the type system is still unable to represent fairly simple concepts when it comes to function typing

what do you mean by this?

[–] bjornsno@lemm.ee 1 points 1 year ago (2 children)

My biggest pet peeve is the complete inability to annotate a set of known exceptions that a function raises in a machine readable way. The discussion about it is quite heated.

In fairness that approach hasn't really worked in other languages. It was so unpopular in C++ that they actually removed the feature, which is almost unheard of. Java supports it too but it's pretty rarely used in my experience. The only place I've seen it used is in Android. It's unpopular enough there that Kotlin doesn't support it.

[–] jjjalljs@ttrpg.network 3 points 1 year ago (1 children)

Interesting. I've never felt a need for this, and as the other reply here said it was really unpopular in other languages.

I would have guessed you would have said something about how it's annoying to type callable arguments, and how Protocol exists but doesn't seem that widely known.

[–] bjornsno@lemm.ee 1 points 1 year ago* (last edited 1 year ago)

Definitely those used to be pain points, but they do exist now so type erasure after decorator application isn't a problem anymore, which used to be another huge one for me.

The discussion around how unpopular it was in other languages seems like such an obvious side track to me. Typing in general went out of fashion and then made a comeback when it was opt-in, why wouldn't the same apply to exceptions? Of course I'm not wanting warnings in every func call because of a potential MemoryCorruptionError, but if a library has some set of known exceptions as a de facto part of its interface then that's currently completely unknown to me and my static type checker.

One kinda bad example is playwright. Almost all playwright functions have the chance to raise a TimeoutError, but even if you know this you'll probably shoot yourself in the foot at least once because it's not the built-in TimeoutError, oh no, it's a custom implementation from the library. If you try to simply try...except TimeoutError:, the exception will blow right by you and crash your script, you've got to import the correct TimeoutError. If it was properly typed then pyright would be able to warn you that you still need to catch the other kind of TimeoutError. It's a bad example because like I said almost all playwright functions can raise this error so you'd get a lot of warnings, but it also demonstrates well the hidden interface problem we have right now, and it's the most recent one that screwed me, so it's the one I remember off the top of my head.