EDIT 2021:
There is a new package that is sort of a hack featuring exactly this functionality in Python. Here is the repo: https://github.com/iann838/nullsafe-python
from nullsafe import undefined, _
value = _(variable).method()
assert value is undefined
assert not value
assert value == None
Works with AttributeError and KeyError aswell
dic = {}
assert _(dic)["nah"] is undefined
assert _(dic).nah is undefined
The wrapped object typings will remain effective.
No, there isn't.
But to check for
None, you don't writeif x:, you writeif x is None:. This is an important distinction -xevaluates toFalsefor quite a few values that are propably perfectly valid (most notably 0-equivalent numbers and empty collections), whereasx is Noneonly evaluates toTrueif the referencexpoints to the singleton objectNone.From personal experience, such an operator would be needed very rarely. Yes,
Noneis sometimes used to indicate no value. But somehow - maybe because idiomatic code returns null objects where sensible or throws exceptions to indicate critical failure - I only get anAttributeError: 'NoneType' object has no attribute '...'twice a month.I would argue that this might be a misfeature.
nullhas two meanings - "forgot to initialize" and "no data". The first is an error and should throw an exception. The second case usually requires more elaborate handling than "let's just not call this method". When I ask the database/ORM for aUserProfile, it's not there and I getnullinstead... do I want to silently skip the rest of the method? Or do I really want to (when in "library code") throw an approriate exception (so "the user (code)" knows the user isn't there and can react... or ignore it) or (when I'm coding a specific feature) show a sensible message ("That user doesn't exist, you can't add it to your friend list") to the user?
First of all, your options depend on what you'd like the expression to evaluate to if the variable is not dereferencable. I'll assume None is the appropriate result in these examples.
A common idiom for some circumstances in Python uses conditional expressions:
variable.method() if variable is not None else None
While this need may not be widespread, there are circumstances where it would be useful, especially when the references are nested and you would want something like this, where that idiom quickly gets cumbersome.
a?.b?.c?.d
Note that support for a ?. operator for safe deferencing is one of the main topics of PEP 505: None-aware operators \| Python.org. It's current status is "deferred".
Some discussion of it is at:
- PEP 505: Bringing None-Aware Operators to Python \| Hacker News