Skip to content

Commit 6eea65f

Browse files
Allow generator evaluation results
1 parent d8586c3 commit 6eea65f

File tree

2 files changed

+29
-6
lines changed

2 files changed

+29
-6
lines changed

etuples/core.py

+21-6
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,13 @@
99
etuple_repr.maxother = 100
1010

1111

12+
class IgnoredGenerator:
13+
__slots__ = ("gen",)
14+
15+
def __init__(self, gen):
16+
self.gen = gen
17+
18+
1219
def trampoline_eval(z, res_filter=None):
1320
"""Evaluate a stream of generators.
1421
@@ -19,6 +26,8 @@ def trampoline_eval(z, res_filter=None):
1926

2027
if not isinstance(z, Generator): # pragma: no cover
2128
return z
29+
elif isinstance(z, IgnoredGenerator):
30+
return z.gen
2231

2332
stack = deque()
2433
z_args, z_out = None, None
@@ -41,7 +50,10 @@ def trampoline_eval(z, res_filter=None):
4150
except StopIteration:
4251
_ = stack.pop()
4352

44-
return z_out
53+
if isinstance(z_out, IgnoredGenerator):
54+
return z_out.gen
55+
else:
56+
return z_out
4557

4658

4759
class InvalidExpression(Exception):
@@ -149,7 +161,8 @@ def __init__(self, seq=None, **kwargs):
149161
@property
150162
def evaled_obj(self):
151163
"""Return the evaluation of this expression tuple."""
152-
return trampoline_eval(self._eval_step())
164+
res = self._eval_step()
165+
return trampoline_eval(res)
153166

154167
@property
155168
def eval_obj(self):
@@ -201,10 +214,12 @@ def _eval_step(self):
201214

202215
_evaled_obj = op(*op_args.args, **op_args.kwargs)
203216

204-
# assert not isinstance(_evaled_obj, ExpressionTuple)
205-
206-
self._evaled_obj = _evaled_obj
207-
yield self._evaled_obj
217+
if isinstance(_evaled_obj, Generator):
218+
self._evaled_obj = _evaled_obj
219+
yield IgnoredGenerator(_evaled_obj)
220+
else:
221+
self._evaled_obj = _evaled_obj
222+
yield self._evaled_obj
208223

209224
@evaled_obj.setter
210225
def evaled_obj(self, obj):

tests/test_core.py

+8
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import sys
22
from operator import add
3+
from types import GeneratorType
34

45
import pytest
56

@@ -118,6 +119,13 @@ def test_op(*args):
118119
assert e_ladd == (1, 2, 3)
119120

120121

122+
def test_etuple_generator():
123+
e_gen = etuple(lambda v: (i for i in v), range(3))
124+
e_gen_res = e_gen.evaled_obj
125+
assert isinstance(e_gen_res, GeneratorType)
126+
assert tuple(e_gen_res) == tuple(range(3))
127+
128+
121129
def test_etuple_kwargs():
122130
"""Test keyword arguments and default argument values."""
123131

0 commit comments

Comments
 (0)