Like most things in life, context matters. In the OP it seems like the check function is used specifically so it could raise a PaymentException if the payment hasn’t been received… That’s not a “forgiveness/permission” context, this is a yes or no question, hence should have been an if.
Day 598 of asking for a way to tell which functions throw exceptions in Python so I can know when to wrap in try catch. Seems to me that every other language has this, but when I’ve asked for at least a linter that can tell me I’m calling a function that throws, the general answer has been “why would you want that?”
How am I supposed to ask for forgiveness if it’s impossible to know that I’m doing something risky in the first place?
Yeah, for this reason I would pretty much never encourage exceptions in Python over some other form of error handling. It’s so frustrating when called code throws some random exceptions that are completely undocumented. This is one of the few things Java got (sort of) right
Not really. Exceptions are a controlled way of indicating something went wrong in an application.
The only point where you wouldn’t know about the possibility of one is when you don’t know enough about the language features you’re using or when you use a badly documented library or framework.
Respectfully, no. Rust is great for some things and Python is great for other things. Switching to rust is not a solution to missing exception linting in another language.
I’m not sure if the ability to tell would help. Just like typing hints are very much optional in Python, I don’t expect many libraries to get their exception declarations right. Especially if there are transitive dependencies
I write Java code for my day job and while throws has been part of the language for ages, Java developers seem intent on avoiding it at all costs.
I would welcome a throws in Python so that libraries and coworkers that do the right thing are easier to work with, but I don’t think it’d solve the underlying issue in most cases.
Well at least php has it, which is a JITed scripting language just like Python. Although saying php has it is wrong, it’s just a special doc tag that the linters pick up. Which is exactly what I want for Python. The only other scripting language I’m very comfortable with is typescript, which can also support @throws via jsdoc and eslint.
So to answer your question, I don’t know if it’s common, but from my minimal sample pool it’s at least not unheard of.
You may not know this (just guessing because you commented on the nature of scripting/interpreted languages) but static analysis of dynamic languages has come really far and is an indispensable part of any reasonably sized project written in them these days. That’s another reason why I’m so surprised and frustrated by the lack of this in Python.
Do you have a specific PEP you’re referencing or is this one of those “I assume this must be the case because of how common using try/except statements for flow control are” kind of things?
Pretty sure its not a PEP, but the python glossary mentions it. Searching ‘python EAFP’ brings up a lot of discussion on the topic too, so if nothing else its definitely a widespread phenomenon
Tbf python guidelines encourage it over if/else in cases like this. “Easier to ask for forgiveness than for permission” or something along the lines
Like most things in life, context matters. In the OP it seems like the
check
function is used specifically so it could raise aPaymentException
if the payment hasn’t been received… That’s not a “forgiveness/permission” context, this is a yes or no question, hence should have been an if.pythonic != good
Truers, just mentioning it
Day 598 of asking for a way to tell which functions throw exceptions in Python so I can know when to wrap in try catch. Seems to me that every other language has this, but when I’ve asked for at least a linter that can tell me I’m calling a function that throws, the general answer has been “why would you want that?”
How am I supposed to ask for forgiveness if it’s impossible to know that I’m doing something risky in the first place?
Yeah, for this reason I would pretty much never encourage exceptions in Python over some other form of error handling. It’s so frustrating when called code throws some random exceptions that are completely undocumented. This is one of the few things Java got (sort of) right
cant practically anything throw an exception given the right (sometimes extremely remotely possible) circumstances?
Not really. Exceptions are a controlled way of indicating something went wrong in an application.
The only point where you wouldn’t know about the possibility of one is when you don’t know enough about the language features you’re using or when you use a badly documented library or framework.
dont many of the language primitives confer the possibility of thrown exceptions?
Check out Rust
Respectfully, no. Rust is great for some things and Python is great for other things. Switching to rust is not a solution to missing exception linting in another language.
Check it out anyways
I’m not sure if the ability to tell would help. Just like typing hints are very much optional in Python, I don’t expect many libraries to get their exception declarations right. Especially if there are transitive dependencies
I write Java code for my day job and while
throws
has been part of the language for ages, Java developers seem intent on avoiding it at all costs.I would welcome a
throws
in Python so that libraries and coworkers that do the right thing are easier to work with, but I don’t think it’d solve the underlying issue in most cases.I believe raises is the de facto Python version of
throws
, but no tools seem to exist to actually handle it.that’s still a docstring, idk of linters that take docstrings into account at all. We need a semantic approach for this kind of annotation.
That’s way harder to ask for. A docstring solution is fine so long as the linters know to pick it up.
Is this feature common in scripting/interpreted languages? Feels like those two things don’t work together.
Well at least php has it, which is a JITed scripting language just like Python. Although saying php has it is wrong, it’s just a special doc tag that the linters pick up. Which is exactly what I want for Python. The only other scripting language I’m very comfortable with is typescript, which can also support
@throws
via jsdoc and eslint.So to answer your question, I don’t know if it’s common, but from my minimal sample pool it’s at least not unheard of.
You may not know this (just guessing because you commented on the nature of scripting/interpreted languages) but static analysis of dynamic languages has come really far and is an indispensable part of any reasonably sized project written in them these days. That’s another reason why I’m so surprised and frustrated by the lack of this in Python.
Do you have a specific PEP you’re referencing or is this one of those “I assume this must be the case because of how common using try/except statements for flow control are” kind of things?
Pretty sure its not a PEP, but the python glossary mentions it. Searching ‘python EAFP’ brings up a lot of discussion on the topic too, so if nothing else its definitely a widespread phenomenon