From a31a4bcd6aafb24eb984f5527b1c8f14813cac2c Mon Sep 17 00:00:00 2001 From: Andreas Kloeckner Date: Sat, 17 Aug 2019 18:41:15 -0500 Subject: [PATCH 1/2] Replace Expression.strifier with Expression.make_stringifier to allow stringifiers with different constructor arguments --- pymbolic/mapper/stringifier.py | 12 ++++++------ pymbolic/primitives.py | 30 ++++++++++++++++++++++-------- pymbolic/version.py | 2 +- 3 files changed, 29 insertions(+), 15 deletions(-) diff --git a/pymbolic/mapper/stringifier.py b/pymbolic/mapper/stringifier.py index ce6f0b8..c5abb3a 100644 --- a/pymbolic/mapper/stringifier.py +++ b/pymbolic/mapper/stringifier.py @@ -119,13 +119,13 @@ class StringifyMapper(pymbolic.mapper.Mapper): # {{{ mappings - def handle_unsupported_expression(self, victim, enclosing_prec, *args, **kwargs): - strifier = victim.stringifier() - if isinstance(self, strifier): + def handle_unsupported_expression(self, expr, enclosing_prec, *args, **kwargs): + strifier = expr.make_stringifier(self) + if isinstance(self, type(strifier)): raise ValueError("stringifier '%s' can't handle '%s'" - % (self, victim.__class__)) - return strifier(self.constant_mapper)( - victim, enclosing_prec, *args, **kwargs) + % (self, expr.__class__)) + return strifier( + expr, enclosing_prec, *args, **kwargs) def map_constant(self, expr, enclosing_prec, *args, **kwargs): result = self.constant_mapper(expr) diff --git a/pymbolic/primitives.py b/pymbolic/primitives.py index 8bc8042..93c14fb 100644 --- a/pymbolic/primitives.py +++ b/pymbolic/primitives.py @@ -191,7 +191,7 @@ class Expression(object): .. method:: __getitem__ - .. automethod:: stringifier + .. automethod:: make_stringifier .. automethod:: __eq__ .. automethod:: __hash__ @@ -446,13 +446,27 @@ class Expression(object): from pymbolic.mapper.evaluator import evaluate_to_float return evaluate_to_float(self) - def stringifier(self): - """Return a :class:`pymbolic.mapper.Mapper` class used to yield - a human-readable representation of *self*. Usually a subclass - of :class:`pymbolic.mapper.stringifier.StringifyMapper`. + def make_stringifier(self, originating_stringifier=None): + """Return a :class:`pymbolic.mapper.Mapper` instance that can + be used to generate a human-readable representation of *self*. Usually + a subclass of :class:`pymbolic.mapper.stringifier.StringifyMapper`. """ - from pymbolic.mapper.stringifier import StringifyMapper - return StringifyMapper + if originating_stringifier is None: + stringify_mapper_args = () + else: + stringify_mapper_args = originating_stringifier.constant_mapper + + try: + stringifier_class_getter = self.stringifier + except AttributeError: + from pymbolic.mapper.stringifier import StringifyMapper + return StringifyMapper(*stringify_mapper_args) + else: + from warnings import warn + warn("%s overrides 'stringifier', which is deprecated. " + "Override 'make_stringifier' instead.") + + return stringifier_class_getter()(*stringify_mapper_args) def __str__(self): """Use the :meth:`stringifier` to return a human-readable @@ -460,7 +474,7 @@ class Expression(object): """ from pymbolic.mapper.stringifier import PREC_NONE - return self.stringifier()()(self, PREC_NONE) + return self.make_stringifier()(self, PREC_NONE) def _safe_repr(self, limit=10): if limit <= 0: diff --git a/pymbolic/version.py b/pymbolic/version.py index 922dd50..6ba2863 100644 --- a/pymbolic/version.py +++ b/pymbolic/version.py @@ -1,3 +1,3 @@ -VERSION = (2018, 1) +VERSION = (2019, 1) VERSION_STATUS = "" VERSION_TEXT = ".".join(str(x) for x in VERSION) + VERSION_STATUS -- GitLab From de093f0b6a4fe085904b860deb5de8999bbf5458 Mon Sep 17 00:00:00 2001 From: Andreas Kloeckner Date: Sat, 17 Aug 2019 18:46:31 -0500 Subject: [PATCH 2/2] Allow Expression.stringifier to return None to force-break older versions of pymbolic --- pymbolic/primitives.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/pymbolic/primitives.py b/pymbolic/primitives.py index 93c14fb..fbead08 100644 --- a/pymbolic/primitives.py +++ b/pymbolic/primitives.py @@ -459,14 +459,17 @@ class Expression(object): try: stringifier_class_getter = self.stringifier except AttributeError: - from pymbolic.mapper.stringifier import StringifyMapper - return StringifyMapper(*stringify_mapper_args) + pass else: from warnings import warn warn("%s overrides 'stringifier', which is deprecated. " "Override 'make_stringifier' instead.") - return stringifier_class_getter()(*stringify_mapper_args) + if stringifier_class_getter is not None: + return stringifier_class_getter()(*stringify_mapper_args) + + from pymbolic.mapper.stringifier import StringifyMapper + return StringifyMapper(*stringify_mapper_args) def __str__(self): """Use the :meth:`stringifier` to return a human-readable -- GitLab