2011-09-07 56 views
2

我只是通过追踪随机错误了,而使用扭曲:生成器装饰器是否存在?

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

而当myfunc叫,我会得到先前追溯印刷但是:

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' 

这是由引起该功能内的所有功能都正常工作这是因为它在调用时返回None而不是发电机,期望返回defer.inlineCallbacks。有没有方法来声明一个函数的生成器,而不是在函数体内放置一个yield语句?比如生成器装饰器?

+3

“有没有办法在函数体中声明一个函数而不放置yield语句?”不会。这会如何解决你的问题? –

+0

如果你的函数不是一个生成器(没有'yield'),那么使用'@ defer.inlineCallbacks'就没有意义了。你想做什么? –

+0

Jochen Ritzel:我期待我会在函数中使用yield语句,所以我用'inlineCallbacks'对它进行了修饰,因为一些相似的函数确实包含了yield,但是chanse从来没有在这个特定的函数中使用yield。 – cpburnz

回答

6

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

没有,你必须使用一个yield,使其发电机,当然除了如果您创建一个装饰,这是一个发电机(由包括yield关键字)本身,而是没有按实际上不会产生任何东西,只是调用装饰函数。这样的yield可能无法达到并且毫无意义(if False: yield),但它必须在那里。由于这不是一个普遍的需求,所以没有什么像后者预先构建的,至少我没有意识到。最简单的方法是将它添加到你的函数中,编写你自己的装饰器在一些情况下是不值得的,如果你经常需要它,那么在没有你的设计的情况下可能会出错,你应该修正它。

1

如果你确实需要它,请创建一个。

#like this 
def generator(callable): 
    def asgenerator(*args, **kwargs): 
     while True: 
      yield callable(*args, **kwargs) 
    return asgenerator 

虽然,正如别人所指出的,这可能隐藏了设计问题。

+3

+1:“这可能隐藏了设计问题”。 –

1

看起来像是碰到了Ticket 2501。这已经在后备箱中得到了修复,将来您遇到的错误将会更加清晰。

+0

+1:这是我的问题的原因(除了没有意识到我没有使用yield语句),但@delnan目录回答了我的问题。 – cpburnz