Source code for core.common
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Description
-----------
Module containing utility classe(s) from which inherit some of the pySDC base
classes.
"""
from pySDC.core.errors import ReadOnlyError
class _MetaRegisterParams(type):
"""Metaclass for RegisterParams base class"""
def __new__(cls, name, bases, dct):
obj = super().__new__(cls, name, bases, dct)
obj._parNamesReadOnly = set()
obj._parNames = set()
return obj
[docs]
class RegisterParams(metaclass=_MetaRegisterParams):
"""
Base class to register parameters.
Attributes
----------
params : dict (property)
Dictionary containing names and values of registered parameters.
_parNames : set of str
Names of all the registered parameters.
_parNamesReadOnly : set of str
Names of all the parameters registered as read-only.
"""
def _makeAttributeAndRegister(self, *names, localVars=None, readOnly=False):
"""
Register a list of attribute name as parameters of the class.
Parameters
----------
*names : list of str
The name of the parameters to be registered (should be class attributes).
localVars : dict
Dictionary containing key=names and values=paramValues for each
parNames given in names. Can be provided, for instance, using
`locals()` built-in dictionary. MUST BE provided as soon as
names contains anything.
readOnly : bool, optional
Wether or not store the parameters as read-only attributes
"""
if len(names) > 1 and localVars is None:
raise ValueError("a dictionary must be provided in localVars with parameters values")
# Set parameters as attributes
for name in names:
try:
super().__setattr__(name, localVars[name])
except KeyError as e: # pragma: no cover
raise ValueError(f'value for {name} not given in localVars') from e
# Register as class parameter
if readOnly:
self._parNamesReadOnly = self._parNamesReadOnly.union(names)
else:
self._parNames = self._parNames.union(names)
@property
def params(self):
"""Dictionary containing names and values of registered parameters"""
return {name: getattr(self, name) for name in self._parNamesReadOnly.union(self._parNames)}
def __setattr__(self, name, value):
if name in self._parNamesReadOnly:
raise ReadOnlyError(name)
super().__setattr__(name, value)