gpt4 book ai didi

python - 协程与 python 中的类

转载 作者:行者123 更新时间:2023-12-02 14:53:25 26 4
gpt4 key购买 nike

我的问题很广泛。既然可以使用对象,为什么还要使用协程呢?我可以很容易地实现一个在 next() 下只工作一次的迭代器,之后你必须调用 o.send(x)。除了可以通过 OOP 实现状态持久化之外,协程还有什么其他的东西吗?它们更轻吗?它只是语法糖吗?关于生成器与迭代器,我实际上可以问同样的问题,但我想我已经读到生成器只是语法糖。

如果确实如此,为什么协程如此重要?我确信我遗漏了一些关于它们的信息,但我不知道是什么。

最佳答案

是的,从技术上讲协程是语法糖,但不是微不足道的那种。任何协同程序都可以在不使用 yieldsend 等的情况下手动重写。但是这种转换可能会很痛苦。考虑(改编自 here ):

def print_name(prefix):
print("Searching prefix: {}".format(prefix))
while True:
firstName = (yield)
lastName = (yield)
if prefix in firstName or prefix in lastName:
print("{} {}".format(firstName, lastName))

可以将其重写为:

class NamePrinter(object):
def __init__(self, prefix):
self.prefix = prefix
self.gotFirstName = False

def send(self, data):
if not self.gotFirstName:
self.firstName = data
self.gotFirstName = True
else:
self.lastName = data
if self.prefix in self.firstName or self.prefix in self.lastName:
print(name)
self.gotFirstName = False

这行得通。但即使是这个微示例,在不使用协程的情况下,我们也必须编写更多内容。在更复杂的有状态协程中,程序员必须手动跟踪当前状态,哪些变量在当前状态下有意义,等等。

Python 中的协程(以及现代 JavaScript 和 future C++ 中的类似 async/await)自动将线性代码转换为具有良好控制输入的状态机,容易错误处理等。

关于python - 协程与 python 中的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54314970/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com