Explorar el Código

Bugfix for deepcopy + small unrelated refactor (issue #938)

tags/gm/2021-09-23T00Z/github.com--lark-parser-lark/0.12.0
Erez Sh hace 3 años
padre
commit
7cb8acbe54
Se han modificado 2 ficheros con 19 adiciones y 7 borrados
  1. +12
    -0
      lark/common.py
  2. +7
    -7
      lark/utils.py

+ 12
- 0
lark/common.py Ver fichero

@@ -1,4 +1,5 @@
from warnings import warn
from copy import deepcopy

from .utils import Serialize
from .lexer import TerminalDef
@@ -31,6 +32,17 @@ class LexerConf(Serialize):
def _deserialize(self):
self.terminals_by_name = {t.name: t for t in self.terminals}

def __deepcopy__(self, memo=None):
return type(self)(
deepcopy(self.terminals, memo),
self.re_module,
deepcopy(self.ignore, memo),
deepcopy(self.postlex, memo),
deepcopy(self.callbacks, memo),
deepcopy(self.g_regex_flags, memo),
deepcopy(self.skip_validation, memo),
deepcopy(self.use_bytes, memo),
)


class ParserConf(Serialize):


+ 7
- 7
lark/utils.py Ver fichero

@@ -73,14 +73,13 @@ class Serialize(object):
fields = getattr(self, '__serialize_fields__')
res = {f: _serialize(getattr(self, f), memo) for f in fields}
res['__type__'] = type(self).__name__
postprocess = getattr(self, '_serialize', None)
if postprocess:
postprocess(res, memo)
if hasattr(self, '_serialize'):
self._serialize(res, memo)
return res

@classmethod
def deserialize(cls, data, memo):
namespace = getattr(cls, '__serialize_namespace__', {})
namespace = getattr(cls, '__serialize_namespace__', [])
namespace = {c.__name__:c for c in namespace}

fields = getattr(cls, '__serialize_fields__')
@@ -94,9 +93,10 @@ class Serialize(object):
setattr(inst, f, _deserialize(data[f], namespace, memo))
except KeyError as e:
raise KeyError("Cannot find key for class", cls, e)
postprocess = getattr(inst, '_deserialize', None)
if postprocess:
postprocess()

if hasattr(inst, '_deserialize'):
inst._deserialize()

return inst




Cargando…
Cancelar
Guardar