Quantcast
Channel: Active questions tagged python - Stack Overflow
Viewing all articles
Browse latest Browse all 13981

Tracking change of variable in Python

$
0
0

I would like to create a data structure containing several settings, these settings will be used to calculate register values of a hardware device. To avoid reconfiguring all settings of the hardware device, I would like to have each variable inside of the data structure remember if it has been changed or not. Then later I would call upon all variables to see which ones are changed to then only write to the connected registers.I can create a class that remembers if any change has occurred to it's internally stored value, I am however experiencing difficulties with returning and resetting the has_changed variable. This due to the overloading of the __get__ function prohibiting the usage of other functions inside of the class.

In the simplified example I have made a class called Table (which should contain variables such as: height, width, length, ...) The current implementation has the class TrackedValidatedInteger which checks if the change is valid.I would like the variable property has_changed to be obtainable and resettable from inside of the class Table.

class TrackedValidatedInteger():    def __init__(self, min_value=None, max_value=None):        self.min_value = min_value        self.max_value = max_value        self.has_changed = False        self.value = None    def __get__(self, obj, objecttype=None):        return self.value    def __set__(self, obj, value):        if self.validate_set(value):            self.value = value            self.has_changed = True            return 1        return 0    def get_has_changed(self):        return self.has_changed    def reset_has_changed(self):        self.has_changed = False    def validate_set(self, value):        if self.min_value:            if self.min_value > value:                print("Value should be between " + str(self.min_value) +" and " + str(self.max_value))                return 0        if self.max_value:            if self.max_value < value:                print("Value should be between " + str(self.min_value) +" and " + str(self.max_value))                return 0        return 1class Table():    length = TrackedValidatedInteger(min_value=0, max_value=3)    height = TrackedValidatedInteger(min_value=0, max_value=6)    width = TrackedValidatedInteger(min_value=0, max_value=7)    def __init__(self, length=0, height=0, width=0):        self.length = length        self.height = height        self.width = width     def reset_has_changed_1(self):        self.length.has_changed = False        self.height.has_changed = False        self.width.has_changed = False    def reset_has_changed_2(self):        self.length.reset_has_changed()        self.height.reset_has_changed()        self.width.reset_has_changed()p = Table()p.length = 3 # will set the variablep.length = 9 # will not set the variable# p.length.get_has_changed() # This does not work as the p.length will call __get__ resulting in an integer which does not have get_has_changed()# p.reset_has_changed_1() # This does not work for the same reason# p.reset_has_changed_2() # This does not work for the same reason

The problem I find is that the __get__ function gets automatically called whenever I try to access any other part of the TrackedValidatedInteger class. Can I access the other variables and functions in any other way? If there are any suggestions on how achieve the same result in another way, I would be glad to hear it. I would personally like to keep the simple setting of the variables (p.length = 3), if not possible this can be changed.

Any help would be greatly appreciated.


Viewing all articles
Browse latest Browse all 13981

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>