2011-09-07 76 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