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
Best Answer
If you know the key is in the dictionary, use
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 toTrue
if theirlen
is greater than 0.It will also raise a
KeyError
if your premise that a key is inmydict
is violated.All this makes it Pythonic.