将Python 3.x中的`yield from`语义向后移植到Python 2.7
项目描述
yieldfrom
是将Python 3.x中的yield from
语义向后移植到Python 2.7的工具。它也支持Python 3.x,因此可以作为兼容性库,用于支持Python两个主要版本的代码。
如果你想在Python 3.x中嵌套生成器,你可以使用yield from
关键字。这允许你自动遍历子生成器,并将异常和返回值从顶级调用者透明地传递到最低级别的生成器。
def subgen():
yield 2
yield 3
def gen():
yield 1
yield from subgen() # Python 3.x only
yield 4
def main():
for i in gen():
print i,
>>> main()
... 1 2 3 4
Python 2.x中不提供此功能,我们通过使用yieldfrom
装饰器和辅助类From
来模拟它。
from yieldfrom import yieldfrom, From
def subgen():
yield 2
yield 3
@yieldfrom
def gen():
yield 1
yield From(subgen())
yield 4
def main():
for i in gen():
print i,
>>> main()
... 1 2 3 4
高级用法允许使用StopIteration
从子生成器返回一个值。使用Return
可以方便地做到这一点。
from yieldfrom import yieldfrom, From, Return
def subgen():
yield 2
yield 3
Return(100) # Raises `StopIteration(100)`
@yieldfrom
def gen():
yield 1
ret = (yield From(subgen()))
yield 4
yield ret
def main():
for i in gen():
print i,
>>> main()
... 1 2 3 4 100
子生成器可以在多个级别上嵌套,每个级别都需要通过yieldfrom
进行额外的装饰。
def subsubgen():
yield 2
@yieldfrom
def subgen():
yield From(subsubgen())
yield 3
@yieldfrom
def gen():
yield 1
yield From(subgen())
yield 4
def main():
for i in gen():
print i,
>>> main()
... 1 2 3 4
可以由相关子生成器处理抛入顶级生成器的异常。
def subsubgen():
try:
yield 2
except ValueError:
yield 200
@yieldfrom
def subgen():
yield From(subsubgen())
yield 3
@yieldfrom
def gen():
yield 1
yield From(subgen())
yield 4
def main():
try:
g = gen()
while True:
i = g.next()
if i == 2:
i = g.throw(ValueError())
print i,
except StopIteration:
pass
>>> main()
... 1 200 3 4
请注意,如果你在简单的可迭代对象(例如list
、tuple
等)上使用yield From()
,则迭代器的各个成员将在每次迭代中产生(在这种情况下,你可能需要使用通常的yield
)。
@yieldfrom
def gen():
yield From([1, 2, 3])
yield [1, 2, 3]
def main():
for i in gen():
print i
>>> main()
... 1
... 2
... 3
... [1, 2, 3]
将非可迭代对象传递给From
将导致产生一个空生成器,该生成器不执行任何操作。
@yieldfrom
def gen():
yield From(None)
yield 1
def main():
for i in gen():
print i
>>> main()
... 1
本模块是对以下Python菜谱的改编:http://code.activestate.com/recipes/576727
修改包括异常处理、命名、文档、空生成器的处理等。
项目详情
关闭
yieldfrom-1.0.5.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | eb75e58641410f06083f85013a438f28bceaabfe5af9c3206d5049362c37aca0 |
|
MD5 | fd94120625ac1e69bb5946d5e63182da |
|
BLAKE2b-256 | 4df9395917f574ace618eb234bcbae8df3fabaa9624532d96d1fbd3a20678b1e |
关闭
yieldfrom-1.0.5-py2.py3-none-any.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | ab52d7b4128b795dd2d942fad0126fcf2d7dbd35cde2a340cdafb66273b0ee3a |
|
MD5 | 6417508867a9a04ff9207c7c38dd0318 |
|
BLAKE2b-256 | d6e84bc727e1fefe1b1b8f5a3516df2f17621271e9a9700afecd86f5c311c613 |