Groovy has a nice operator for safe dereferencing, which helps to avoid NullPointerExceptions:
method will only be called, if
variable is not
Is there a way to do the same in Python? Or do I have to write
if variable: variable.method()?
No, there isn't.
But to check for
None, you don't write
if x:, you write
if x is None:. This is an important distinction -
x evaluates to
False for quite a few values that are propably perfectly valid (most notably 0-equivalent numbers and empty collections), whereas
x is None only evaluates to
True if the reference
x points to the singleton object
From personal experience, such an operator would be needed very rarely. Yes,
None is 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 an
AttributeError: 'NoneType' object has no attribute '...' twice a month.
I would argue that this might be a misfeature.
null has 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 a
UserProfile, it's not there and I get
null instead... 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?
I've used this feature in Groovy, so I won't repeat the blub paradox of other posters.
In Groovy a statement like this
Does this in Python
try: testVar = possiblyNull.value except: testVar = None if(testVar):
It's definitely a cool feature in Groovy, and is helpful in removing syntactical noise. There are a few other bits of syntactical sugar, like the Elvis operator or *, but they do sacrifice legibility as the expense for quick fix symbols (in other words, they're no Pythonic).
Hope that helps :-)