I have a dictionary that sometimes receives calls for non-existent keys, so I try and use hasattr
and getattr
to handle these cases:
key_string = 'foo'
print "current info:", info
print hasattr(info, key_string)
print getattr(info, key_string, [])
if hasattr(info, key_string):
array = getattr(info, key_string, [])
array.append(integer)
info[key_string] = array
print "current info:", info
The first time this runs with integer = 1
:
current info: {}
False
[]
current info: {'foo': [1]}
Running this code again with integer = 2
:
instance.add_to_info("foo", 2)
current info: {'foo': [1]}
False
[]
current info: {'foo': [2]}
The first run is clearly successful ({'foo': [1]}
), but hasattr
returns false and getattr
uses the default blank array the second time around, losing the value of 1
in the process! Why is this?
hasattr
does not test for members of a dictionary. Use thein
operator instead, or the.has_key
method:But note that
dict.has_key()
has been deprecated, is recommended against by the PEP 8 style guide and has been removed altogether in Python 3.Incidentally, you'll run into problems by using a mutable class variable:
Initialize it in your
__init__
instead:A dictionary key is not the same as an object attribute
Looks like all you need is one line:
It's handy to have defined a reflective
getAttr
that gets attributes or keys from an object.To test for elements in a list/dictionary, use
in
. To use defaults, you can usedict.get
:Or use defaultdict: