如何从 __next__ 方法中产生?
How to yield from __next__ method?
我认为下面的代码可以表达想要的结果:
class LockIterator(object):
def __init__(self, lock_list):
self.lock_list = lock_list
def __iter__(self):
return self
def __next__(self):
for resource in self.lock_list:
print( "Locking N resources" )
yield resource
print( "Unlocking N resources" )
print( "Unlocking remaining resources" )
raise StopIteration
for item in LockIterator( ["Resource 1", "Resource 2", "Resource 3"] ):
print("Safe resource usage:", item)
但是,运行在 Python 上使用它,我得到了一个无限循环:
Safe resource usage: <generator object LockIterator.__next__ at 0x000001A8BDA24938>
Safe resource usage: <generator object LockIterator.__next__ at 0x000001A8BB8AEE60>
Safe resource usage: <generator object LockIterator.__next__ at 0x000001A8BDA24938>
Safe resource usage: <generator object LockIterator.__next__ at 0x000001A8BB8AEE60>
Safe resource usage: <generator object LockIterator.__next__ at 0x000001A8BDA24938>
Safe resource usage: <generator object LockIterator.__next__ at 0x000001A8BB8AEE60>
Safe resource usage: <generator object LockIterator.__next__ at 0x000001A8BDA24938>
Safe resource usage: <generator object LockIterator.__next__ at 0x000001A8BB8AEE60>
...
在我的想象中,它应该是运行这样的:
Locking N resources
Safe resource usage: Resource 1
Unlocking N resources
Locking N resources
Safe resource usage: Resource 2
Unlocking N resources
Locking N resources
Safe resource usage: Resource 3
Unlocking N resources
Unlocking remaining resources
您知道如何在普通的 for 循环中自动强制执行此行为吗?
for item in LockIterator( ["Resource 1", "Resource 2", "Resource 3"] ):
print("Safe resource usage:", item)
__next__
每次 for 循环需要一个新项目时都会被调用。由于您的 __next__
是一个生成器,因此每次都会返回。
相反,您可以去掉 class 并只编写一个生成器:
def LockIterator(lock_list):
# better name this lockify or something else in snake_case
for resource in lock_list:
print("Locking N resources")
yield resource
print("Unlocking N resources")
print("Unlocking remaining resources")
我还设法通过删除 __next__
并将其主体移动到 __iter__
方法来修复它:
class LockIterator(object):
def __init__(self, lock_list):
self.lock_list = lock_list
def __iter__(self):
for resource in self.lock_list:
print( "Locking N resources" )
yield resource
print( "Unlocking N resources" )
print( "Unlocking remaining resources" )
for item in LockIterator( ["Resource 1", "Resource 2", "Resource 3"] ):
print("Safe resource usage:", item)
我认为下面的代码可以表达想要的结果:
class LockIterator(object):
def __init__(self, lock_list):
self.lock_list = lock_list
def __iter__(self):
return self
def __next__(self):
for resource in self.lock_list:
print( "Locking N resources" )
yield resource
print( "Unlocking N resources" )
print( "Unlocking remaining resources" )
raise StopIteration
for item in LockIterator( ["Resource 1", "Resource 2", "Resource 3"] ):
print("Safe resource usage:", item)
但是,运行在 Python 上使用它,我得到了一个无限循环:
Safe resource usage: <generator object LockIterator.__next__ at 0x000001A8BDA24938>
Safe resource usage: <generator object LockIterator.__next__ at 0x000001A8BB8AEE60>
Safe resource usage: <generator object LockIterator.__next__ at 0x000001A8BDA24938>
Safe resource usage: <generator object LockIterator.__next__ at 0x000001A8BB8AEE60>
Safe resource usage: <generator object LockIterator.__next__ at 0x000001A8BDA24938>
Safe resource usage: <generator object LockIterator.__next__ at 0x000001A8BB8AEE60>
Safe resource usage: <generator object LockIterator.__next__ at 0x000001A8BDA24938>
Safe resource usage: <generator object LockIterator.__next__ at 0x000001A8BB8AEE60>
...
在我的想象中,它应该是运行这样的:
Locking N resources
Safe resource usage: Resource 1
Unlocking N resources
Locking N resources
Safe resource usage: Resource 2
Unlocking N resources
Locking N resources
Safe resource usage: Resource 3
Unlocking N resources
Unlocking remaining resources
您知道如何在普通的 for 循环中自动强制执行此行为吗?
for item in LockIterator( ["Resource 1", "Resource 2", "Resource 3"] ):
print("Safe resource usage:", item)
__next__
每次 for 循环需要一个新项目时都会被调用。由于您的 __next__
是一个生成器,因此每次都会返回。
相反,您可以去掉 class 并只编写一个生成器:
def LockIterator(lock_list):
# better name this lockify or something else in snake_case
for resource in lock_list:
print("Locking N resources")
yield resource
print("Unlocking N resources")
print("Unlocking remaining resources")
我还设法通过删除 __next__
并将其主体移动到 __iter__
方法来修复它:
class LockIterator(object):
def __init__(self, lock_list):
self.lock_list = lock_list
def __iter__(self):
for resource in self.lock_list:
print( "Locking N resources" )
yield resource
print( "Unlocking N resources" )
print( "Unlocking remaining resources" )
for item in LockIterator( ["Resource 1", "Resource 2", "Resource 3"] ):
print("Safe resource usage:", item)