mahmoud / glom

☄️ Python's nested data operator (and CLI), for all your declarative restructuring needs. Got data? Glom it! ☄️
https://glom.readthedocs.io
Other
1.89k stars 61 forks source link

Memo spec proposal #229

Open kurtbrose opened 2 years ago

kurtbrose commented 2 years ago

Here's the proposal: Memo(), a glom memoization primitive.

On each top-level glom execution, Memo() would reset.

Here's a rough implementation:

class Memo:
   def __init__(self, spec):
      self.spec = spec

   def glom(self, target, scope):
      glom_globals = scope[ROOT]
      if self not in glom_globals:
         glom_globals[self] = ({}, {})
      val_memo, id_memo = glom_globals[self]
      try:
         hash(target)
      except:
         memo, memo_key = id_memo, id(target)
      else:
         memo, memo_key = val_memo, target
      if memo_key not in memo:
         memo[memo_key] = scope[glom](target, self.spec, scope)
      return memo[memo_key]

Motivation:

kurtbrose commented 2 years ago

also, kind of a dupe of https://github.com/mahmoud/glom/issues/186