Home > Enterprise >  Attributes as dictionary values
Attributes as dictionary values

Time:10-25

I'm attempting to set attributes on a dict key and have a feeling my approach is wrong. How would I get the current key inside alfa? Alfa in production will be used to create and update a dataclass.

class Dictn(dict):
    def __init__(self, *args, **kwds):
        super(Dictn, self).__init__(*args, **kwds)
        self.__dict__ = self

    def __getitem__(self, key):
        if key not in self.keys():
            self.__setitem__(key, None)
        dict.__getitem__(self, key)
        return self

    def alfa(self, **kwds):
        ''' Need current key to set attributes on it '''
        self.__setattr__(**kwds)

    def beta(self, **kwds):
        ''' Need current key to set attributes on it '''
        self.__setattr__(**kwds) 

dictn = Dictn()
dictn['ABC'].alfa(es=1, te=2)
dictn['ABC'].beta(es=3, te=4)

EDIT:

Solution was using a class as an attribute setter.

@dataclass()
class Position:
    es: int = None
    te: int = None


class ValueObj():
    def alfa(self, **kwds):
        setattr(self, 'alfa', Position(**kwds))

    def beta(self, **kwds):
        setattr(self, 'beta', Position(**kwds))

class Dictn(dict):
    def __init__(self, *args, **kwds):
        super(Dictn, self).__init__(*args, **kwds)
        self.__dict__ = self

    def __getitem__(self, key):
        if key not in self.keys():
            self.__setitem__(   key,
                                ValueObj(),
                            )
        return dict.__getitem__(self, key)

dictn = Dictn()
dictn['ABC'].alfa(es=1, te=2)

dictn['ABC'].alfa
>> Position(es=1, te=2)

CodePudding user response:

A dictionary stores objects that can be recovered as key-value pairs. (Remember, everything in python is an object.) If you want those objects to have additional attributes, you need to edit them directly, not the dict class which only acts as a container. The dict doesn't really care what it stores, and it certainly isn't (and shouldn't be) responsible for handling any properties on its contents.

(By the way, dictn["ABC"] represents a value in the dictionary, not a key. They key here is "ABC". I'm not sure if you're just confusing the definitions here or if you mean something else entirely.)

CodePudding user response:

You could set an instance variable to the key used in __getitem__().

class Dictn(dict):
    def __init__(self, *args, **kwds):
        super(Dictn, self).__init__(*args, **kwds)
        self.__dict__ = self

    def __getitem__(self, key):
        if key not in self.keys():
            self.__setitem__(key, None)
        self.current_key = key
        dict.__getitem__(self, key)
        return self

    def alfa(self, **kwds):
        // use self.current_key to get current_key to set attributes on it
        self.__setattr__(**kwds)

    def beta(self, **kwds):
        // use self.current_key to get current_key to set attributes on it
        self.__setattr__(**kwds) 
  • Related