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.
Advertisement
Answer
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.
