Source code for openfisca_core.parameters.parameter_node_at_instant
import os
import sys
import numpy
from openfisca_core import parameters, tools
from openfisca_core.errors import ParameterNotFoundError
from openfisca_core.parameters import helpers
[docs]class ParameterNodeAtInstant:
"""
Parameter node of the legislation, at a given instant.
"""
def __init__(self, name, node, instant_str):
"""
:param name: Name of the node.
:param node: Original :any:`ParameterNode` instance.
:param instant_str: A date in the format `YYYY-MM-DD`.
"""
# The "technical" attributes are hidden, so that the node children can be easily browsed with auto-completion without pollution
self._name = name
self._instant_str = instant_str
self._children = {}
for child_name, child in node.children.items():
child_at_instant = child._get_at_instant(instant_str)
if child_at_instant is not None:
self.add_child(child_name, child_at_instant)
def add_child(self, child_name, child_at_instant):
self._children[child_name] = child_at_instant
setattr(self, child_name, child_at_instant)
def __getattr__(self, key):
param_name = helpers._compose_name(self._name, item_name = key)
raise ParameterNotFoundError(param_name, self._instant_str)
def __getitem__(self, key):
# If fancy indexing is used, cast to a vectorial node
if isinstance(key, numpy.ndarray):
return parameters.VectorialParameterNodeAtInstant.build_from_node(self)[key]
return self._children[key]
def __iter__(self):
return iter(self._children)
def __repr__(self):
result = os.linesep.join(
[os.linesep.join(
["{}:", "{}"]).format(name, tools.indent(repr(value)))
for name, value in self._children.items()]
)
if sys.version_info < (3, 0):
return result
return result