Coverage for pySDC / core / common.py: 100%
23 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-03-27 07:06 +0000
« prev ^ index » next coverage.py v7.13.5, created at 2026-03-27 07:06 +0000
1#!/usr/bin/env python3
2# -*- coding: utf-8 -*-
3"""
4Description
5-----------
7Module containing utility classe(s) from which inherit some of the pySDC base
8classes.
9"""
11from typing import Any, Optional, Set, Dict
12from pySDC.core.errors import ReadOnlyError
15class _MetaRegisterParams(type):
16 """Metaclass for RegisterParams base class"""
18 def __new__(cls, name: str, bases: tuple, dct: dict) -> type:
19 obj = super().__new__(cls, name, bases, dct)
20 obj._parNamesReadOnly = set()
21 obj._parNames = set()
22 return obj
25class RegisterParams(metaclass=_MetaRegisterParams):
26 """
27 Base class to register parameters.
29 Attributes
30 ----------
31 params : dict (property)
32 Dictionary containing names and values of registered parameters.
33 _parNames : set of str
34 Names of all the registered parameters.
35 _parNamesReadOnly : set of str
36 Names of all the parameters registered as read-only.
37 """
39 def _makeAttributeAndRegister(
40 self, *names: str, localVars: Optional[Dict[str, Any]] = None, readOnly: bool = False
41 ) -> None:
42 """
43 Register a list of attribute name as parameters of the class.
45 Parameters
46 ----------
47 *names : list of str
48 The name of the parameters to be registered (should be class attributes).
49 localVars : dict
50 Dictionary containing key=names and values=paramValues for each
51 parNames given in names. Can be provided, for instance, using
52 `locals()` built-in dictionary. MUST BE provided as soon as
53 names contains anything.
54 readOnly : bool, optional
55 Wether or not store the parameters as read-only attributes
56 """
57 if len(names) > 1 and localVars is None:
58 raise ValueError("a dictionary must be provided in localVars with parameters values")
59 # Set parameters as attributes
60 for name in names:
61 try:
62 super().__setattr__(name, localVars[name])
63 except KeyError as e: # pragma: no cover
64 raise ValueError(f'value for {name} not given in localVars') from e
65 # Register as class parameter
66 if readOnly:
67 self._parNamesReadOnly = self._parNamesReadOnly.union(names)
68 else:
69 self._parNames = self._parNames.union(names)
71 @property
72 def params(self) -> Dict[str, Any]:
73 """Dictionary containing names and values of registered parameters"""
74 return {name: getattr(self, name) for name in self._parNamesReadOnly.union(self._parNames)}
76 def __setattr__(self, name: str, value: Any) -> None:
77 if name in self._parNamesReadOnly:
78 raise ReadOnlyError(name)
79 super().__setattr__(name, value)