Python special identifier with object identifiers

I want to create a special dictionary that uses object identifiers as keys, for example:

class ObjectIdDict(dict):

    def __setitem__(self, key, value):
        super(ObjectIdDict, self).__setitem__(id(key), value)

    def __getitem__(self, key):
        super(ObjectIdDict, self).__getitem__(id(key))

But if I run the following test, I get an error message:

class ObjectIdDictTest(unittest.TestCase):
    def test_get_and_set(self):
        dict_to_test = ObjectIdDict()
        class Something:
            def __init__(self):
                self.x = 1
        s = Something()
        dict_to_test[s.x] = "message"
        self.assertEqual(dict_to_test[s.x], "message")     

Error message:

AssertionError: None != 'message'                   

What is wrong here?

Background:

The reason for creating such an exotic dictate is that I want to store validation errors for each field of the object and want to avoid field names as strings: domain_object.errors[domain_object.field1]otherwise field names as strings ( domain_object.errors["field1"]) would be bad for refactoring and code completion.

ΤΖΩΤΖΙΟΥ:

I am sure that you will not get anything using identifiers. obj.field1= 1; print(id(obj.field1)); obj.field1= 2; print(id(obj.field1))

If I did not use identifiers, the key would be the value of the variable, and not its address. This will lead to errors if the two fields have the same value:

def test_ordinary_dict(self):
    dict_to_test = {}
    class Something:
        def __init__(self):
            self.x = 1
            self.y = 1 # same value as self.x!
    s = Something()
    dict_to_test[s.x] = "message for x"
    dict_to_test[s.y] = "message for y"
    self.assertEqual(dict_to_test[s.x], "message for x")

    # fails because dict_to_test[s.x] == dict_to_test[1] what results in:
    # "message for y"

, , .

+3
1

__getitem__ :

def __getitem__(self, key):
  return super(ObjectIdDict, self).__getitem__(id(key))
  #^^^^^

return None , , oiddict[key] is None .

+4

All Articles