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
« 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
7def _prop(key):
8 def getter(fields):
9 return _get_elements(fields._var, key)
11 def setter(fields, x):
12 return _set_elements(fields._var, key, x)
14 return property(getter, setter)
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]
23def _fields(obj):
24 class Fields:
25 def __init__(self, keys, var):
26 self._var = var
27 self._keys = keys
29 def __contains__(self, key):
30 return key in self._keys
32 def __iter__(self):
33 return self._keys.__iter__()
35 def __getitem__(self, key):
36 return _get_elements(self._var, key)
38 def __setitem__(self, key, x):
39 return _set_elements(self._var, key, x)
41 def keys(self):
42 yield from self._keys
44 def values(self):
45 yield from (self[key] for key in self)
47 def items(self):
48 yield from ((key, self[key]) for key in self)
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