3
3
import warnings
4
4
from collections import deque
5
5
from collections .abc import Generator , Sequence
6
- from typing import Any , Callable
6
+ from typing import Callable
7
7
8
8
etuple_repr = reprlib .Repr ()
9
9
etuple_repr .maxstring = 100
@@ -178,8 +178,16 @@ def eval_obj(self):
178
178
)
179
179
return trampoline_eval (self ._eval_step ())
180
180
181
- def _eval_apply (self , op : Callable , op_args : inspect .BoundArguments ) -> Any :
182
- return op (* op_args .args , ** op_args .kwargs )
181
+ def _eval_apply_fn (self , op : Callable ) -> Callable :
182
+ """Return the callable used to evaluate the expression tuple.
183
+
184
+ The expression tuple's operator can be any `Callable`, i.e. either
185
+ a function or an instance of a class that defines `__call__`. In
186
+ the latter case, one can evalute the expression tuple using a
187
+ method other than `__call__` by overloading this method.
188
+
189
+ """
190
+ return op
183
191
184
192
def _eval_step (self ):
185
193
if len (self ._tuple ) == 0 :
@@ -210,7 +218,7 @@ def _eval_step(self):
210
218
evaled_args .append (i )
211
219
212
220
try :
213
- op_sig = inspect .signature (op )
221
+ op_sig = inspect .signature (self . _eval_apply_fn ( op ) )
214
222
except ValueError :
215
223
# This handles some builtin function types
216
224
_evaled_obj = op (* (evaled_args + [kw .value for kw in evaled_kwargs ]))
@@ -220,7 +228,7 @@ def _eval_step(self):
220
228
)
221
229
op_args .apply_defaults ()
222
230
223
- _evaled_obj = self ._eval_apply (op , op_args )
231
+ _evaled_obj = self ._eval_apply_fn (op )( * op_args . args , ** op_args . kwargs )
224
232
225
233
if isinstance (_evaled_obj , Generator ):
226
234
self ._evaled_obj = _evaled_obj
0 commit comments