Source code for oemof.solph.plumbing

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

"""Plumbing stuff.
"""

__copyright__ = "oemof developer group"
__license__ = "GPLv3"

from collections import abc, UserList


[docs]def sequence(sequence_or_scalar): """ Tests if an object is sequence (except string) or scalar and returns a the original sequence if object is a sequence and a 'emulated' sequence object of class _Sequence if object is a scalar or string. Parameters ---------- sequence_or_scalar : array-like, None, int, float Examples -------- >>> sequence([1,2]) [1, 2] >>> x = sequence(10) >>> x[0] 10 >>> x[10] 10 >>> print(x) [10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10] """ if (isinstance(sequence_or_scalar, abc.Iterable) and not isinstance(sequence_or_scalar, str)): return sequence_or_scalar else: return _Sequence(default=sequence_or_scalar)
class _Sequence(UserList): """ Emulates a list whose length is not known in advance. Parameters ---------- source: default: Examples -------- >>> s = _Sequence(default=42) >>> len(s) 0 >>> s[2] 42 >>> len(s) 3 >>> s[0] = 23 >>> s [23, 42, 42] """ def __init__(self, *args, **kwargs): self.default = kwargs["default"] super().__init__(*args) def __getitem__(self, key): try: return self.data[key] except IndexError: self.data.extend([self.default] * (key - len(self.data) + 1)) return self.data[key] def __setitem__(self, key, value): try: self.data[key] = value except IndexError: self.data.extend([self.default] * (key - len(self.data) + 1)) self.data[key] = value