2010-03-05 72 views
0

我現在使用iPython來交互式地設置一個Twisted網絡。我在IPython中運行該腳本描述最好的是我必須做的:未綁定的python方法,潛在的作用域問題

import router, pdb 

# creates nodes which encapsulate RandomVector and VectorAdder objects 
a = router.LocalNode(router.RandomVector, '/topic/a_c') 
b = router.LocalNode(router.RandomVector, '/topic/b_c') 
c = router.LocalNode(router.VectorAdder) 
c.registerAsListener('/topic/a_c') 
c.registerAsListener('/topic/b_c') 

def conn(): 
    global a 
    global b 
    a.onConnect() 
    b.onConnect() 


router.r.loadOnConnect(conn) 
router.STOMPconnect(router.r) 
router.reactor.run() 

發生了什麼事是,康涅狄格州()被傳遞到扭曲的協議,它運行康恩()每次連接丟失。

的onConnect看起來是這樣的:

def onConnect(self): 
    self._lc = LoopingCall(self.advance) 
    self._lc.start(1) 

每當爲onConnect獲取運行,我得到的錯誤:

類型錯誤:「未綁定方法的onConnect()必須與RandomVector實例作爲第一個參數來調用(啥都沒相反)'

有誰知道爲什麼會發生這種情況?

+1

由於您沒有分配給全局變量,所以'conn()'中不需要全局聲明。 – 2010-03-05 17:17:19

回答

2

我不認爲這是一個範圍界定問題。你確定你不需要使用:

a = router.LocalNode(router.RandomVector(), '/topic/a_c') 
b = router.LocalNode(router.RandomVector(), '/topic/b_c') 

即實例化​​你傳遞給LocalNode的RandomVector?

此建議由Unboud方法錯誤消息觸發:未綁定的方法是鏈接到類而不是實例/對象的方法。當你的消息抱怨a.onConnect是一個未綁定的方法時,它看起來像你需要傳遞一個實例而不是一個類。

+1

這聽起來像是對我的正確答案。不過,這可能有助於解釋更多關於Python中未綁定方法的內容。 – 2010-03-06 00:59:10