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

1#!/usr/bin/env python3 

2# -*- coding: utf-8 -*- 

3""" 

4Description 

5----------- 

6 

7Module containing utility classe(s) from which inherit some of the pySDC base 

8classes. 

9""" 

10 

11from typing import Any, Optional, Set, Dict 

12from pySDC.core.errors import ReadOnlyError 

13 

14 

15class _MetaRegisterParams(type): 

16 """Metaclass for RegisterParams base class""" 

17 

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 

23 

24 

25class RegisterParams(metaclass=_MetaRegisterParams): 

26 """ 

27 Base class to register parameters. 

28 

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 """ 

38 

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. 

44 

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) 

70 

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)} 

75 

76 def __setattr__(self, name: str, value: Any) -> None: 

77 if name in self._parNamesReadOnly: 

78 raise ReadOnlyError(name) 

79 super().__setattr__(name, value)