The return of None-aware operators for Python
The return of None-aware operators for Python
Posted Jan 5, 2024 20:44 UTC (Fri) by NYKevin (subscriber, #129325)In reply to: The return of None-aware operators for Python by marcH
Parent article: The return of None-aware operators for Python
Because of Python's laissez-faire multi-paradigm attitude, it's actually quite difficult to design a good implementation of None-aware operators. You can't really use the Rust solution, because Python is dynamically-typed and likes to signal errors with exceptions rather than sentinel values (i.e. you can't reasonably define it to propagate Result<V, E> or the like, since Result is not even a thing in Python). But the TypeError or ValueError that you tend to get from None is usually the wrong exception to throw, and propagating None as if it was NaN will make it difficult to get a traceback. The idiomatic behavior, in some cases, is to eagerly check for None and raise an exception.
Maybe this syntax could work?
x = y ?? raise FooError('y should not be None.')
But that is going to be problematic. Raise is a statement, not an expression, so you'd need to make a special case to allow it in this one context, or you'd need to convert it into an expression. And then people will also want to write x = y ?? z, so you need to allow for that as well.
I have no idea how this is supposed to be extended for ?. and ?[], because where are you supposed to put the raise?
Posted Jan 7, 2024 14:21 UTC (Sun)
by cpitrat (subscriber, #116459)
[Link] (13 responses)
May I interest you in assert?
Posted Jan 8, 2024 22:06 UTC (Mon)
by NYKevin (subscriber, #129325)
[Link] (12 responses)
(Also, you can't specify the exception type, but that's small potatoes in comparison.)
Posted Jan 8, 2024 22:13 UTC (Mon)
by khim (subscriber, #9252)
[Link] (4 responses)
I have just tested and that doesn't happen. What version of python are you using??? I have never observed that effect in Python, but there are many implementations, maybe one of them does that, but for me it's reason not to use it rather then change use of
Posted Jan 8, 2024 22:22 UTC (Mon)
by mb (subscriber, #50428)
[Link]
$ cat t.py
Posted Jan 8, 2024 23:19 UTC (Mon)
by NYKevin (subscriber, #129325)
[Link] (1 responses)
Posted Jan 8, 2024 23:26 UTC (Mon)
by NYKevin (subscriber, #129325)
[Link]
As far as I can tell, 1.4 did not have an assert statement, so the assert statement has never been unconditional in any released version of Python.
Posted Jan 8, 2024 23:40 UTC (Mon)
by ABCD (subscriber, #53650)
[Link]
Posted Jan 8, 2024 23:36 UTC (Mon)
by marcH (subscriber, #57642)
[Link] (1 responses)
> so the assert is just for documentation purposes (to inform the next person who reads the code that the invariant exists and is important).
Small contradiction here.
I didn't know about the -O flag and I've always "run" asserts and every time one is hit it is massively more useful than a comment!
> so the implication is that your code is expected to be correct even when asserts are not run.
Agreed.
Posted Jan 8, 2024 23:37 UTC (Mon)
by NYKevin (subscriber, #129325)
[Link]
Sorry, my brain is smaller than yours, can you please elaborate?
Posted Jan 9, 2024 11:28 UTC (Tue)
by cpitrat (subscriber, #116459)
[Link]
But you can easily define your own raiseIfNone.
Posted Jan 9, 2024 15:11 UTC (Tue)
by atnot (subscriber, #124910)
[Link] (3 responses)
Posted Jan 9, 2024 15:28 UTC (Tue)
by kleptog (subscriber, #1183)
[Link]
Posted Jan 9, 2024 19:13 UTC (Tue)
by NYKevin (subscriber, #129325)
[Link]
Posted Jan 10, 2024 16:28 UTC (Wed)
by laarmen (subscriber, #63948)
[Link]
The return of None-aware operators for Python
The return of None-aware operators for Python
> assert is not properly used for any purpose other than as a "live comment" (i.e. a comment that actually gets executed). This is because the -O flag disables asserts, so the implication is that your code is expected to be correct even when asserts are not run.
The return of None-aware operators for Python
assert
.The return of None-aware operators for Python
assert 2+2==5
$ python3.11 t.py
[...]
AssertionError
$ python3.11 -O t.py
The return of None-aware operators for Python
The return of None-aware operators for Python
The return of None-aware operators for Python
The return of None-aware operators for Python
The return of None-aware operators for Python
The return of None-aware operators for Python
The return of None-aware operators for Python
The return of None-aware operators for Python
The return of None-aware operators for Python
The return of None-aware operators for Python