DEV Community

Super Kai (Kazuya Ito)
Super Kai (Kazuya Ito)

Posted on

Generator in Python (4)

Buy Me a Coffee

*Memo:

gi_yieldfrom can return an iterator if the generator is resumed at yield from otherwise it returns None as shown below:

def gen():
    yield from [0, 1]
    yield 2
    yield from [3, 4]
    yield 5

v = gen()

while True:
    try:
        print(v.gi_yieldfrom, next(v.gi_yieldfrom))
    except:
        print(v.gi_yieldfrom, next(v))
# None 0
# <list_iterator object at 0x000001C66EBFE410> 1
# <list_iterator object at 0x000001C66EBFE410> 2
# None 3
# <list_iterator object at 0x000001C66EBFE410> 4
# <list_iterator object at 0x000001C66EBFE410> 5
Enter fullscreen mode Exit fullscreen mode

gi_running can check if the generator is currently running as shown below:

<yield>:

def gen():
    print(v.gi_running, 'gen') # True gen
    yield 0
    print(v.gi_running, 'gen') # True gen
    yield 1
    print(v.gi_running, 'gen') # True gen
    yield 2
    print(v.gi_running, 'gen') # True gen

v = gen()

print(v.gi_running) # False
print(next(v))      # 0
print(v.gi_running) # False
print(next(v))      # 1
print(v.gi_running) # False
print(next(v))      # 2
print(v.gi_running) # False
print(next(v))      # StopIteration:
Enter fullscreen mode Exit fullscreen mode

<yield from>:

def gen():
    print(v.gi_running, 'gen') # True gen
    yield from [0, 1]
    print(v.gi_running, 'gen') # True gen
    yield from [2, 3]
    print(v.gi_running, 'gen') # True gen
    yield from [4, 5]
    print(v.gi_running, 'gen') # True gen

v = gen()

print(v.gi_running) # False
print(next(v))      # 0
print(v.gi_running) # False
print(next(v))      # 1
print(v.gi_running) # False
print(next(v))      # 2
print(v.gi_running) # False
print(next(v))      # 3
print(v.gi_running) # False
print(next(v))      # 4
print(v.gi_running) # False
print(next(v))      # 5
print(v.gi_running) # False
print(next(v))      # StopIteration:
Enter fullscreen mode Exit fullscreen mode

gi_suspended can check if the generator is currently suspended(paused) as shown below:

<yield>:

def gen():
    print(v.gi_suspended, 'gen') # False gen
    yield 0
    print(v.gi_suspended, 'gen') # False gen
    yield 1
    print(v.gi_suspended, 'gen') # False gen
    yield 2
    print(v.gi_suspended, 'gen') # False gen

v = gen()

print(v.gi_suspended) # False
print(next(v))        # 0
print(v.gi_suspended) # True
print(next(v))        # 1
print(v.gi_suspended) # True
print(next(v))        # 2
print(v.gi_suspended) # True
print(next(v))        # StopIteration:
Enter fullscreen mode Exit fullscreen mode

<yield from>:

def gen():
    print(v.gi_suspended, 'gen') # False gen
    yield from [0, 1]
    print(v.gi_suspended, 'gen') # False gen
    yield from [2, 3]
    print(v.gi_suspended, 'gen') # False gen
    yield from [4, 5]
    print(v.gi_suspended, 'gen') # False gen

v = gen()

print(v.gi_suspended) # False
print(next(v))        # 0
print(v.gi_suspended) # True
print(next(v))        # 1
print(v.gi_suspended) # True
print(next(v))        # 2
print(v.gi_suspended) # True
print(next(v))        # 3
print(v.gi_suspended) # True
print(next(v))        # 4
print(v.gi_suspended) # True
print(next(v))        # 5
print(v.gi_suspended) # True
print(next(v))        # StopIteration:
Enter fullscreen mode Exit fullscreen mode

Top comments (0)