Every now and then I come across code like this:
foo = Foo()
...
if foo.bar is not None and foo.bar.baz == 42:
shiny_happy(...)
Which seems, well, unpythonic, to me.
In Objective-C, you can send messages to nil and get nil as the answer. I've always thought that's quite handy. Of course it is possible to implement a Null pattern in Python, however judging from the results Google's given me, it seems this is not very widely used. Why's that?
Or even better—would it be a bad idea to let None.whatever return None instead of raising an exception?
In Python, there is no such value as null. Instead, Python has None that represents null.
Python uses the keyword None to define null objects and variables. While None does serve some of the same purposes as null in other languages, it's another beast entirely. As the null in Python, None is not defined to be 0 or any other value.
There's no null in Python; instead there's None . As stated already, the most accurate way to test that something has been given None as a value is to use the is identity operator, which tests that two variables refer to the same object.
Use the is operator to check if a variable is null in Python, e.g. if my_var is None: . The is operator returns True if the values on the left-hand and right-hand sides point to the same object and should be used when checking for singletons like None . Copied! Note that there isn't a null value in Python.
PEP 336 - Make None Callable proposed a similar feature:
None should be a callable object that when called with any arguments has no side effect and returns None.
The reason for why it was rejected was simply "It is considered a feature that None raises an error when called."
I'm sorry, but that code is pythonic. I think most would agree that "explicit is better than implicit" in Python. Python is a language that is easy to read compared to most, and people should not defeat that by writing cryptic code. Make the meaning very clear.
foo = Foo()
...
if foo.bar is not None and foo.bar.baz == 42:
shiny_happy(...)
In this code sample, it is clear that foo.bar is sometimes None on this code path, and that we only run shiny_happy() if it is not None, and .baz == 42. Very clear to anyone what is going on here and why. The same can not be said for the null pattern, or the try ... except code in one of the answers posted here. It's one thing if your language, like Objective-C or javascript enforces a null pattern, but in a language where it is not used at all, it will just create confusion and code that is difficult to read. When programming in python, do as the pythonistas do.
Couldn't you do a try except? The Pythonic way says It is Easier to Ask for Forgiveness than Permission.
So:
try:
if foo.bar.baz == 42:
shiny_happy(...)
except AttributeError:
pass #or whatever
Or do it without possibly silencing more exceptions than desired:
try:
baz = foo.bar.baz
except AttributeError:
pass # handle error as desired
else:
if baz == 42:
shiny_happy(...)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With