Shortcuts

Source code for ding.utils.autolog.value

from typing import Type

from .base import _LOGGED_VALUE__PROPERTY_NAME, _LOGGED_MODEL__PROPERTY_ATTR_PREFIX, _ValueType
from .data import TimeRangedData


[docs]class LoggedValue: """ Overview: LoggedValue can be used as property in LoggedModel, for it has __get__ and __set__ method. This class's instances will be associated with their owner LoggedModel instance, all the LoggedValue of one LoggedModel will shared the only one time object (defined in time_ctl), so that timeline can be managed properly. Interfaces: ``__init__``, ``__get__``, ``__set__`` Properties: - __property_name (:obj:`str`): The name of the property. """
[docs] def __init__(self, type_: Type[_ValueType] = object): """ Overview: Initialize the LoggedValue object. Interfaces: ``__init__`` """ self.__type = type_
@property def __property_name(self): """ Overview: Get the name of the property. """ return getattr(self, _LOGGED_VALUE__PROPERTY_NAME) def __get_ranged_data(self, instance) -> TimeRangedData: """ Overview: Get the ranged data. Interfaces: ``__get_ranged_data`` """ return getattr(instance, _LOGGED_MODEL__PROPERTY_ATTR_PREFIX + self.__property_name) def __get__(self, instance, owner): """ Overview: Get the value. Arguments: - instance (:obj:`LoggedModel`): The owner LoggedModel instance. - owner (:obj:`type`): The owner class. """ return self.__get_ranged_data(instance).current() def __set__(self, instance, value: _ValueType): """ Overview: Set the value. Arguments: - instance (:obj:`LoggedModel`): The owner LoggedModel instance. - value (:obj:`_ValueType`): The value to set. """ if isinstance(value, self.__type): return self.__get_ranged_data(instance).append(value) else: raise TypeError( 'New value should be {expect}, but {actual} found.'.format( expect=self.__type.__name__, actual=type(value).__name__, ) )