Source code for nxpy.core.memo.memo

# nxpy_memo -------------------------------------------------------------------

# Copyright Nicola Musatti 2008 - 2018
# Use, modification, and distribution are subject to the Boost Software
# License, Version 1.0. (See accompanying file LICENSE.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt)

# See https://github.com/nmusatti/nxpy/tree/master/libs/memo. -----------------

r"""
Memoize class instances according to a given key.
 
By default the key only assumes the *True* value, thus implementing a singleton. 

"""

from __future__ import absolute_import

import nxpy.core.abstract
import nxpy.core.past

if nxpy.core.past.V_2_6.at_least():
    import abc
    import six


[docs]class Memo(object): r""" Base class for classes that require memoization. Subclasses should override the *_key(\*args, \*\*kwargs)* method to compute a key on the constructor's arguments. Care should be taken to avoid calling *__init__()* again for entities already constructed. """ #if nxpy.core.past.V_2_6.at_least(): # __metaclass__ = abc.ABCMeta _dict = {}
[docs] def __new__(cls, *args, **kwargs): r""" Return the instance corresponding to the given key, creating it if it doesn't exist. """ k = cls._key(*args, **kwargs) try: return Memo._dict[(cls, k)] except KeyError: i = super(Memo, cls).__new__(cls) Memo._dict[(cls, k)] = i return i
if nxpy.core.past.V_2_6.at_least(): @nxpy.core.abstract.abstractstatic def _key(*args, **kwargs): r""" Returns the key by which instances are memoized. Subclasses should override it as a function of their construction arguments. """ return True else: @staticmethod def _key(*args, **kwargs): return True
if nxpy.core.past.V_2_6.at_least(): Memo = six.add_metaclass(abc.ABCMeta)(Memo)