- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的问题很广泛。既然可以使用对象,为什么还要使用协程呢?我可以很容易地实现一个在 next() 下只工作一次的迭代器,之后你必须调用 o.send(x)。除了可以通过 OOP 实现状态持久化之外,协程还有什么其他的东西吗?它们更轻吗?它只是语法糖吗?关于生成器与迭代器,我实际上可以问同样的问题,但我想我已经读到生成器只是语法糖。
如果确实如此,为什么协程如此重要?我确信我遗漏了一些关于它们的信息,但我不知道是什么。
最佳答案
是的,从技术上讲协程是语法糖,但不是微不足道的那种。任何协同程序都可以在不使用 yield
、send
等的情况下手动重写。但是这种转换可能会很痛苦。考虑(改编自 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/
在我的设置中,我试图有一个界面 Table继承自 Map (因为它主要用作 map 的包装器)。两个类继承自 Table - 本地和全局。全局的将有一个可变的映射,而本地的将有一个只有本地条目的映射。
Rust Nomicon 有 an entire section on variance除了关于 Box 的这一小节,我或多或少地理解了这一点和 Vec在 T 上(共同)变体. Box and Vec
我是一名优秀的程序员,十分优秀!