Skip to content

Commit 4e5c76e

Browse files
author
Sylvain MARIE
committed
Lambda expressions now have a normal repr by default, and this can be disabled by using a flag. Fixes #12
1 parent ddbde67 commit 4e5c76e

File tree

4 files changed

+23
-7
lines changed

4 files changed

+23
-7
lines changed

code_generation/mini_lambda_methods_generation.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,7 @@ def define_what_needs_to_be_written():
259259
# .__repr__, .__str__, .__bytes__, .__format__,
260260
# __sizeof__
261261
to_override_with_exception.add(OverExc('__str__', unbound_method=str))
262-
to_override_with_exception.add(OverExc('__repr__', unbound_method=repr))
262+
# to_override_with_exception.add(OverExc('__repr__', unbound_method=repr))
263263
to_override_with_exception.add(OverExc('__bytes__', unbound_method=bytes))
264264
# this is a special case
265265
to_override_with_exception.add(OverExc('__format__', unbound_method=format))
Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,8 @@ class _LambdaExpressionGenerated(_LambdaExpressionBase):
6969

7070
# return a new LambdaExpression of the same type than self, with the new function as inner function
7171
string_expr = get_repr(self, ${o.precedence_level}) + ' ${o.pair_operator} ' + get_repr(other, ${o.precedence_level})
72-
return type(self)(fun=_${o.method_name}, precedence_level=${o.precedence_level}, str_expr=string_expr, root_var=root_var)
72+
return type(self)(fun=_${o.method_name}, precedence_level=${o.precedence_level}, str_expr=string_expr,
73+
root_var=root_var, repr_on=self.repr_on)
7374

7475
## -----------------------------
7576
% else:
@@ -88,7 +89,8 @@ class _LambdaExpressionGenerated(_LambdaExpressionBase):
8889

8990
# return a new LambdaExpression of the same type than self, with the new function as inner function
9091
string_expr = get_repr(other, ${o.precedence_level}) + ' ${o.pair_operator} ' + get_repr(self, ${o.precedence_level})
91-
return type(self)(fun=_${o.method_name}, precedence_level=${o.precedence_level}, str_expr=string_expr, root_var=root_var)
92+
return type(self)(fun=_${o.method_name}, precedence_level=${o.precedence_level}, str_expr=string_expr,
93+
root_var=root_var, repr_on=self.repr_on)
9294

9395
## -----------------------------
9496
% endif
@@ -115,7 +117,7 @@ class _LambdaExpressionGenerated(_LambdaExpressionBase):
115117
+ ', '.join([arg_name + '=' + get_repr(arg, None) for arg_name, arg in kwargs.items()])
116118
+ ')')
117119
return type(self)(fun=_${o.method_name}, precedence_level=_PRECEDENCE_SUBSCRIPTION_SLICING_CALL_ATTRREF,
118-
str_expr=string_expr, root_var=root_var)
120+
str_expr=string_expr, root_var=root_var, repr_on=self.repr_on)
119121

120122
## -----------------------------
121123
% else:
@@ -139,7 +141,7 @@ class _LambdaExpressionGenerated(_LambdaExpressionBase):
139141
+ ', '.join([arg_name + '=' + get_repr(arg, None) for arg_name, arg in kwargs.items()]) \
140142
+ ')'
141143
return type(self)(fun=_${o.method_name}, precedence_level=_PRECEDENCE_SUBSCRIPTION_SLICING_CALL_ATTRREF,
142-
str_expr=string_expr, root_var=root_var)
144+
str_expr=string_expr, root_var=root_var, repr_on=self.repr_on)
143145

144146
## -----------------------------
145147
% endif

mini_lambda/base.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,15 +48,16 @@ class _LambdaExpressionBase(object):
4848
self._fun (res) by doing res.meth(*other_args)
4949
"""
5050

51-
__slots__ = ['_fun', '_str_expr', '_root_var', '_precedence_level']
51+
__slots__ = ['repr_on', '_fun', '_str_expr', '_root_var', '_precedence_level']
5252

5353
def __init__(self,
5454
str_expr=None, # type: str
5555
is_constant=False, # type: bool
5656
constant_value=None, # type: Any
5757
precedence_level=None, # type: int
5858
fun=None, # type: Callable
59-
root_var=None
59+
root_var=None,
60+
repr_on=True # type: bool
6061
):
6162
"""
6263
Constructor with an optional nested evaluation function. If no argument is provided, the nested evaluation
@@ -70,6 +71,8 @@ def __init__(self,
7071
:param fun:
7172
:param root_var:
7273
"""
74+
self.repr_on = repr_on
75+
7376
# case 1: constant
7477
if is_constant:
7578
if precedence_level is not None or fun is not None or root_var is not None:
@@ -131,6 +134,15 @@ def evaluate(self, arg):
131134
"""
132135
return self._fun(arg)
133136

137+
def __repr__(self):
138+
if self.repr_on:
139+
return "<_LambdaExpression: %s>" % self.to_string()
140+
else:
141+
raise FunctionDefinitionError('__repr__ is not supported by this Lambda Expression. If you wish to '
142+
'use `repr` in the lambda expression, use the replacement method `Repr`.'
143+
'If you wish to enable repr again to see the expression in your IDE,'
144+
'set the `repr_on` attribute to True')
145+
134146
def to_string(self):
135147
"""
136148
Returns a string representation of this InputEvaluator (Since str() does not work, it would return a new

mini_lambda/tests/test_mini_lambda.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,8 @@ def test_evaluator_repr():
123123
s = InputVar('s', str)
124124

125125
# the repr operator cannot be overloaded
126+
assert repr(s) == '<_LambdaExpression: s>'
127+
s.repr_on = False
126128
with pytest.raises(FunctionDefinitionError):
127129
repr(s)
128130

0 commit comments

Comments
 (0)