Reputation: 3523
I have a generator function in a class:
self.s = [['a',1],['b',2],['c',3]
def generator(self):
for r in self.s:
yield r
In another function I initalize it as a variable:
var = self.generator()
And it's yielded as necessary:
>>> next(var) # returns ['a',1]
>>> next(var) # returns ['b',2]
>>> next(var) # returns ['c',3]
Can defining the generator be done in one line, however? I've considered the below:
var = lambda: [(yield r) for r in self.s]
>>> next(var) # SyntaxError: 'yield' inside list comprehension
Here's a minimal code I'm working with:
class Foo():
def __init__(self):
self.s = {}
def generator(self):
for r in self.s:
yield r
def fetch(self):
if not self.s:
self.fetch_gen = self.generator()
self.s['a'] = 1
self.s['b'] = 2
self.s['c'] = 3
try:
var = self.s.get(next(self.fetch_gen))
except StopIteration:
return None
return var
BAR = Foo()
while True:
OUT = BAR.fetch()
if OUT is None:
break
print(OUT)
Output is below:
1
2
3
I just wanted to see if I could get rid of Foo.generator
and instead declare the generator in one line.
Upvotes: 0
Views: 528
Reputation: 7221
You are returning a list comprehension. You can just do:
var = (r for r in self.s)
that will generate a generator with the values you want. You test it later with next(var)
is in your code.
Upvotes: 2