gpt4 book ai didi

python - 是否存在生成器装饰器?

转载 作者:行者123 更新时间:2023-11-28 20:27:52 25 4
gpt4 key购买 nike

我刚刚在使用 Twisted 时跟踪了一个随机错误:

Traceback (most recent call last):
File "/usr/lib/python2.7/dist-packages/twisted/spread/pb.py", line 826, in proto_message
self._recvMessage(self.localObjectForID, requestID, objectID, message, answerRequired, netArgs, netKw)
File "/usr/lib/python2.7/dist-packages/twisted/spread/pb.py", line 840, in _recvMessage
netResult = object.remoteMessageReceived(self, message, netArgs, netKw)
File "/usr/lib/python2.7/dist-packages/twisted/spread/flavors.py", line 114, in remoteMessageReceived
state = method(*args, **kw)
File "/usr/lib/python2.7/dist-packages/twisted/internet/defer.py", line 1141, in unwindGenerator
return _inlineCallbacks(None, f(*args, **kwargs), Deferred())
--- <exception caught here> ---
File "/usr/lib/python2.7/dist-packages/twisted/internet/defer.py", line 1020, in _inlineCallbacks
result = g.send(result)
exceptions.AttributeError: 'NoneType' object has no attribute 'send'

这是由于:

@defer.inlineCallbacks
def myfunc():
# Function implementation with no yield statement.

myfunc 被调用时,我会打印之前的回溯,但函数内的所有内容都正常工作。这是因为它在调用时返回了 None 而不是生成器,defer.inlineCallbacks 期望返回。有没有办法在不在函数体内放置 yield 语句的情况下将函数声明为生成器?比如生成器装饰器?

最佳答案

正如其他人所指出的,这可能没有任何意义。但为了完整性和回答问题:

,您必须使用yield 使其成为生成器,当然,如果您创建的装饰器是生成器(通过包含yield 关键字)本身,但实际上并没有产生任何东西,只是调用了装饰函数。这样的 yield 可能无法访问且毫无意义(if False: yield),但它必须存在。由于这不是一个普遍的需求,所以没有什么比后者预建的,至少我不知道。迄今为止最简单的方法是将它添加到您的函数中,在某些情况下编写您自己的装饰器是不值得的,如果您经常需要它,那么您的设计可能有问题,您应该改正它。

关于python - 是否存在生成器装饰器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7339577/

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