Исходный код libUtils
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Библиотека дополнительных удобных штук libUtils
-----------------------------------------------
"""
import copy # была проблема с объектами типа np.array - они копировались на весь список.. Пришлось копировать через copy.copy
[документация]
class DataBuffer():
""" буфер данных (внутри используется list)
для хранения данных с предыдущих итераций
добавлять точки по одной
Args:
Obj (object) - объект, атрибут которого будем хранить.
Объект обязательно должен содержать атрибут с текущим временем (Time)
Пример использования в классе задачи:
.. code-block:: python
def Setup(self):
self.Buf = DataBuffer(Obj=self)
self.Buf.Setup('t', ['x','y'], N=3)
def Initialize(self):
self.Buf.Initialize()
def Run(self):
self.Buf.Run()
print(self.Buf.x[-1]) # выводим i-1 значение x
print(self.Buf.x[-2]) # выводим i-2 значение x
"""
def __init__(self, Obj=None):
if Obj is None:
raise ValueError('Storager: укажите объект базы данных Obj')
self.Obj = Obj
[документация]
def Setup(self, TimeKey, Keys, N=1):
""" Метод настраивает буфер
Args:
TimeKey (str): имя переменной, в которой хранится время
Keys (list of str): список переменных БД, которые будут хранится
N (int): колво точек
"""
self.Keys = Keys
self.Keys.insert(0, TimeKey)
setattr(self, TimeKey, [getattr(self.Obj, TimeKey) for i in range(N)])
[документация]
def Initialize(self):
""" инициализация - при старте заполняем буфера переменных текущим значением """
N = len(getattr(self, self.Keys[0]))
for key in self.Keys:
setattr(self, key, [getattr(self.Obj, key) for i in range(N)])
[документация]
def Run(self):
""" добавление точки (текущего состояния БД)
TODO: for -> np.roll """
for key in self.Keys:
V = getattr(self, key)
V.pop(0)
V.append(copy.copy(getattr(self.Obj, key)))
#%%
if __name__ == '__main__':
import numpy as np
class Cont():
pass
Obj = Cont()
Obj.t = 0
Obj.x = np.array([1, 2])
Obj.y = 0.1
Buf = DataBuffer(Obj=Obj)
Buf.Setup('t', ['x','y'], N=3)
Buf.Initialize()
for t in range(5):
Obj.t = t
Obj.x = np.array([1.1+t, 1])
Obj.y = 0.2+t
Buf.Run()
print(Buf.x)
Buf.x[-1]