我刚刚使用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'
Run Code Online (Sandbox Code Playgroud)
这是由于:
@defer.inlineCallbacks
def myfunc():
# Function implementation with no yield statement.
Run Code Online (Sandbox Code Playgroud)
当myfunc被调用时,我会打印出之前的回溯,但功能中的所有内容都能正常工作.这是因为它None在调用时返回了一个生成器,它defer.inlineCallbacks希望返回.有没有办法将函数声明为生成器而不在函数体中放置yield语句?比如发电机装饰?
小智 6
正如其他人所指出的那样,这可能毫无意义.但为了完整性并回答这个问题:
不,你必须使用a yield来使它成为一个生成器,当然,除非你创建一个装饰器,它是一个生成器(通过包含yield关键字)本身,但实际上并没有产生任何东西,只是调用装饰函数.这样的a yield可以无法访问且毫无意义(if False: yield),但必须存在.由于这不是常见的需求,因此没有像预先构建的那样,至少我没有意识到.最简单的方法是将它添加到你的函数中,编写你自己的装饰器在一些情况下是不值得的,如果你经常需要它,没有你的设计可能有些错误,你应该修改它.
| 归档时间: |
|
| 查看次数: |
2571 次 |
| 最近记录: |