I'd like to use instances of any type as a key in a single dict
.
def add_to_dict(my_object, d, arbitrary_val = '123'):
d[ id(my_object) ] = arbitrary_val
d = {}
add_to_dict('my_str', arbitrary_val)
add_to_dict(my_list, arbitrary_val)
add_to_dict(my_int, arbirtray_val)
my_object = myclass()
my_object.__hash__ = None
add_to_dict(my_object, arbitrary_val)
The above won't work because my_list
and my_object
can't be hashed.
My first thought was to just pass in the id
value of the object using the id()
function.
def add_to_dict(my_object, d, arbitrary_val = '123'):
d[ id(my_object) ] = arbitrary_val
However, that won't work because id('some string') == id('some string')
is not guaranteed to always be True
.
My second thought was to test if the object has the __hash__
attribute. If it does, use the object, otherwise, use the id()
value.
def add_to_dict(my_object, d, arbitrary_val = '123'):
d[ my_object if my_object.__hash__ else id(my_object) ] = arbitrary_val
However, since hash()
and id()
both return int
's, I believe I will eventually get a collision.
How can I write add_to_dict(obj, d)
above to ensure that no matter what obj
is (list
, int
, str
, object
, dict
), it will correctly set the item in the dictionary and do so without collision?