diff --git a/km3io/offline.py b/km3io/offline.py index c59302474b2f2aa722e0f0d400cfcb32e1db767a..b93802b9cc9698fee8cbff5c5df2c05f1563c235 100644 --- a/km3io/offline.py +++ b/km3io/offline.py @@ -113,17 +113,23 @@ class Header: values += [None] * (n_max - n_values) fields += ["field_{}".format(i) for i in range(n_fields, n_max)] - Constructor = namedtuple(attribute, fields) - if not values: continue - self._data[attribute] = Constructor( - **{f: to_num(v) for (f, v) in zip(fields, values)} - ) + entry = {f: to_num(v) for (f, v) in zip(fields, values)} + try: + self._data[attribute] = namedtuple(attribute, fields)(**entry) + except ValueError: + self._data[attribute] = [to_num(v) for v in values] for attribute, value in self._data.items(): - setattr(self, attribute, value) + try: + setattr(self, attribute, value) + except ValueError: + log.warning( + f"Invalid attribute name for header entry '{attribute}'" + ", access only as dictionary key." + ) def __str__(self): lines = ["MC Header:"] @@ -134,3 +140,6 @@ class Header: else: lines.append(" {}: {}".format(key, value)) return "\n".join(lines) + + def __getitem__(self, key): + return self._data[key] diff --git a/tests/test_offline.py b/tests/test_offline.py index c9fd88f49773a5bd5cd4f5ad8fab4c27ebffb34c..63f6c8ef42417e5dc492bb40995e3e3c818aaf1f 100644 --- a/tests/test_offline.py +++ b/tests/test_offline.py @@ -98,6 +98,20 @@ class TestHeader(unittest.TestCase): assert "test" == header.undefined.field_2 assert 3.4 == header.undefined.field_3 + def test_header_with_invalid_field_or_attribute_names(self): + head = { + "a": "1 2 3", + "b+c": "4 5 6", + } + + header = Header(head) + assert 1 == header["a"][0] + assert 2 == header["a"][1] + assert 3 == header["a"][2] + assert 4 == header["b+c"][0] + assert 5 == header["b+c"][1] + assert 6 == header["b+c"][2] + def test_reading_header_from_sample_file(self): head = OFFLINE_NUMUCC.header