Coverage for install/scipp/core/structured.py: 89%

36 statements  

« prev     ^ index     » next       coverage.py v7.4.0, created at 2024-04-28 01:28 +0000

1# SPDX-License-Identifier: BSD-3-Clause 

2# Copyright (c) 2023 Scipp contributors (https://github.com/scipp) 

3# @author Simon Heybrock 

4from .._scipp.core import DType, _element_keys, _get_elements, _set_elements 

5 

6 

7def _prop(key): 

8 def getter(fields): 

9 return _get_elements(fields._var, key) 

10 

11 def setter(fields, x): 

12 return _set_elements(fields._var, key, x) 

13 

14 return property(getter, setter) 

15 

16 

17def is_structured(obj): 

18 if obj.bins is not None: 

19 return is_structured(obj.bins.constituents['data']) 

20 return obj.dtype in [DType.vector3, DType.linear_transform3] 

21 

22 

23def _fields(obj): 

24 class Fields: 

25 def __init__(self, keys, var): 

26 self._var = var 

27 self._keys = keys 

28 

29 def __contains__(self, key): 

30 return key in self._keys 

31 

32 def __iter__(self): 

33 return self._keys.__iter__() 

34 

35 def __getitem__(self, key): 

36 return _get_elements(self._var, key) 

37 

38 def __setitem__(self, key, x): 

39 return _set_elements(self._var, key, x) 

40 

41 def keys(self): 

42 yield from self._keys 

43 

44 def values(self): 

45 yield from (self[key] for key in self) 

46 

47 def items(self): 

48 yield from ((key, self[key]) for key in self) 

49 

50 if is_structured(obj): 

51 keys = _element_keys(obj) 

52 for key in keys: 

53 setattr(Fields, key, _prop(key)) 

54 return Fields(keys=keys, var=obj) 

55 return None