Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

The most Pythonic way of checking if a value in a dictionary is defined/has zero length

Say I have a dictionary, and I want to check if a key is mapped to a nonempty value. One way of doing this would be the len function:

mydict = {"key" : "value", "emptykey" : ""} print "True" if len(mydict["key"]) > 0 else "False"  # prints true print "True" if len(mydict["emptykey"]) > 0 else "False"  # prints false 

However, one can rely on the semantics of Python and how if an object is defined it evaluates to true and leave out the len call:

mydict = {"key" : "value", "emptykey" : ""} print "True" if mydict["key"] else "False"  # prints true print "True" if mydict["emptykey"] else "False"  # prints false 

However, I'm not sure which is more Pythonic. The first feels "explicit is better than implicit", however the second feels "simple is better than complex".

I also wonder if the leaving out the len call could bite me as the dict I'm working with doesn't necessarily contain strings, but could contain other len-able types (lists, sets, etc). OTOH, in the former (with the len call) if None gets stored as a value the code will blow up, whereas the non-len version will work as expected (will eval to false).

Which version is safer and more Pythonic?

Edit: clarifying assumptions: I know the key is in the dictionary, and I know values will be len-able. I also cannot avoid having zero-length values enter the dictionary.

Edit #2: It seems like people are missing the point of my question. I'm not trying to determine the most Pythonic/safest way of checking if a key is present in a dictionary, I'm trying to check if a value has zero length or not

like image 239
Adam Parkin Avatar asked Oct 14 '11 17:10

Adam Parkin


1 Answers

If you know the key is in the dictionary, use

if mydict["key"]:     ... 

It is simple, easy to read, and says, "if the value tied to 'key' evaluates to True, do something". The important tidbit to know is that container types (dict, list, tuple, str, etc) only evaluate to True if their len is greater than 0.

It will also raise a KeyError if your premise that a key is in mydict is violated.

All this makes it Pythonic.

like image 74
Ethan Furman Avatar answered Oct 12 '22 00:10

Ethan Furman