异步的语义等价物
Semantic equivalent of async for
从 Python 3.5 中 async for
语法的相关文档中,我了解到引入它是为了迭代可等待的迭代器。
虽然在描述之后的语义等价物中我没有得到一些东西:
iter = (ITER)
iter = type(iter).__aiter__(iter)
running = True
while running:
try:
TARGET = await type(iter).__anext__(iter)
except StopAsyncIteration:
running = False
else:
BLOCK
else:
BLOCK2
iter = type(iter).__aiter__(iter)
行在做什么?为什么有必要?
python 中的魔术方法,例如__add__
,总是looked up on the class。例如,len(foo)
实际上会 调用 解析为 type(foo).__len__(foo)
。这意味着如果在 foo
.
上定义了 __len__
,它将 永远不会 使用 foo.__len__
由于__aiter__
是一个魔术方法,因此它总是被查找为type(foo).__aiter__(foo)
。
查找示例:
class Thingy(object):
def __len__(self):
return 10
lengthy_thingy = Thingy()
lengthy_thingy.__len__ = lambda self: 20
print(len(lengthy_thingy)) # gives `10`
print(lengthy_thingy.__len__(lengthy_thingy)) # gives `20` instead
print(type(lengthy_thingy).__len__(lengthy_thingy)) # gives `10` as for using `len`
从 Python 3.5 中 async for
语法的相关文档中,我了解到引入它是为了迭代可等待的迭代器。
虽然在描述之后的语义等价物中我没有得到一些东西:
iter = (ITER)
iter = type(iter).__aiter__(iter)
running = True
while running:
try:
TARGET = await type(iter).__anext__(iter)
except StopAsyncIteration:
running = False
else:
BLOCK
else:
BLOCK2
iter = type(iter).__aiter__(iter)
行在做什么?为什么有必要?
python 中的魔术方法,例如__add__
,总是looked up on the class。例如,len(foo)
实际上会 调用 解析为 type(foo).__len__(foo)
。这意味着如果在 foo
.
__len__
,它将 永远不会 使用 foo.__len__
由于__aiter__
是一个魔术方法,因此它总是被查找为type(foo).__aiter__(foo)
。
查找示例:
class Thingy(object):
def __len__(self):
return 10
lengthy_thingy = Thingy()
lengthy_thingy.__len__ = lambda self: 20
print(len(lengthy_thingy)) # gives `10`
print(lengthy_thingy.__len__(lengthy_thingy)) # gives `20` instead
print(type(lengthy_thingy).__len__(lengthy_thingy)) # gives `10` as for using `len`