Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>One solution I just came up with would be to implement a View of the list via class <code>ListView</code> which takes the following arguments:</p> <ul> <li><code>raw_list</code>: a list of <code>One</code>-objects</li> <li><code>raw2new</code>: a function that converts <code>One</code>-objects to <code>Two</code>-objects</li> <li><code>new2raw</code>: a function that converts <code>Two</code>-objects to <code>One</code>-objects</li> </ul> <p>Here is a the code:</p> <pre><code>class ListView(list): def __init__(self, raw_list, raw2new, new2raw): self._data = raw_list self.converters = {'raw2new': raw2new, 'new2raw': new2raw} def __repr__(self): repr_list = [self.converters['raw2new'](item) for item in self._data] repr_str = "[" for element in repr_list: repr_str += element.__repr__() + ",\n " repr_str = repr_str[:-3] + "]" return repr_str def append(self, item): self._data.append(self.converters['new2raw'](item)) def pop(self, index): self._data.pop(index) def __getitem__(self, index): return self.converters['raw2new'](self._data[index]) def __setitem__(self, key, value): self._data.__setitem__(key, self.converters['new2raw'](value)) def __delitem__(self, key): return self._data.__delitem__(key) def __getslice__(self, i, j): return ListView(self._data.__getslice__(i,j), **self.converters) def __contains__(self, item): return self._data.__contains__(self.converters['new2raw'](item)) def __add__(self, other_list_view): assert self.converters == other_list_view.converters return ListView( self._data + other_list_view._data, **self.converters ) def __len__(self): return len(self._data) def __eq__(self, other): return self._data == other._data def __iter__(self): return iter([self.converters['raw2new'](item) for item in self._data]) </code></pre> <p>Now, <code>DataUI</code> has to look something like this:</p> <pre><code>class DataUI(object): def __init__(self, list_of_ones): for one in list_of_ones: assert type(one) == One self.list_of_ones = list_of_ones self.list_of_twos = ListView( self.list_of_ones, Two.newByDTO, Two.getDTO ) </code></pre> <p>With that, <code>Two</code> needs the following method:</p> <pre><code>def getDTO(self): return self._dto </code></pre> <p>The entire example would now look like the following:</p> <pre><code>import unittest import numpy as np class ListView(list): def __init__(self, raw_list, raw2new, new2raw): self._data = raw_list self.converters = {'raw2new': raw2new, 'new2raw': new2raw} def __repr__(self): repr_list = [self.converters['raw2new'](item) for item in self._data] repr_str = "[" for element in repr_list: repr_str += element.__repr__() + ",\n " repr_str = repr_str[:-3] + "]" return repr_str def append(self, item): self._data.append(self.converters['new2raw'](item)) def pop(self, index): self._data.pop(index) def __getitem__(self, index): return self.converters['raw2new'](self._data[index]) def __setitem__(self, key, value): self._data.__setitem__(key, self.converters['new2raw'](value)) def __delitem__(self, key): return self._data.__delitem__(key) def __getslice__(self, i, j): return ListView(self._data.__getslice__(i,j), **self.converters) def __contains__(self, item): return self._data.__contains__(self.converters['new2raw'](item)) def __add__(self, other_list_view): assert self.converters == other_list_view.converters return ListView( self._data + other_list_view._data, **self.converters ) def __len__(self): return len(self._data) def __iter__(self): return iter([self.converters['raw2new'](item) for item in self._data]) def __eq__(self, other): return self._data == other._data class One(object): """ Data Transfere Object (DTO) """ def __init__(self, name, data): assert type(name) == str assert type(data) == str self.name = name self.data = data def __repr__(self): return "%s(%r, %r)" %(self.__class__.__name__, self.name, self.data) class Two(np.ndarray): _DTO = One def __new__(cls, name, data): dto = cls._DTO(name, data) return cls.newByDTO(dto) @classmethod def newByDTO(cls, dto): obj = np.fromstring(dto.data, dtype="float", sep=',').view(cls) obj.setflags(write=False) # Immutable obj._dto = dto return obj @property def name(self): return self._dto.name def getDTO(self): return self._dto class DataUI(object): def __init__(self, list_of_ones): for one in list_of_ones: assert type(one) == One self.list_of_ones = list_of_ones self.list_of_twos = ListView( self.list_of_ones, Two.newByDTO, Two.getDTO ) class TestListView(unittest.TestCase): def testProperties(self): o1 = One('first object', "1, 3.0, 7, 8,1") o2 = One('second object', "3.7, 8, 10") my_data = DataUI ([o1, o2]) t1 = Two('third object', "4.8, 8.2, 10.3") t2 = Two('forth object', "33, 1.8, 1.0") # append: my_data.list_of_twos.append(t1) # __getitem__: np.testing.assert_array_equal(my_data.list_of_twos[2], t1) # __add__: np.testing.assert_array_equal( (my_data.list_of_twos + my_data.list_of_twos)[5], t1) # __getslice__: np.testing.assert_array_equal( my_data.list_of_twos[1:], my_data.list_of_twos[1:2] + my_data.list_of_twos[2:] ) # __contains__: self.assertEqual(my_data.list_of_twos.__contains__(t1), True) # __setitem__: my_data.list_of_twos.__setitem__(1, t1), np.testing.assert_array_equal(my_data.list_of_twos[1], t1) # __delitem__: l1 = len(my_data.list_of_twos) my_data.list_of_twos.__delitem__(1) l2 = len(my_data.list_of_twos) self.assertEqual(l1 - 1, l2) # __iter__: my_data_2 = DataUI ([]) for two in my_data.list_of_twos: my_data_2.list_of_twos.append(two) if __name__ == '__main__': unittest.main() </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload