2017-04-05 104 views
0

有一個類應該創建一個描述連接到遠程Linux服務器使用paramiko的對象。Python類奇怪的行爲

class Oracle: 
    def __init__(self): 
    ... 
    self.outfile = outfile 

在這堂課我有2個功能。文件的一個回報列表:

def oratab(self): 
    self.remote.send("cat /etc/oratab\n") 
    ... 
    return oralst 
> [u'one', u'oneone', u'oneoneone'] 

另外一個利用的oratab FUNC文件列表返回從遠程服務器的信息:

def get_arcs(self, n): 
     yield basestatus, sum(lst) 
self.remote.send("exit\n") 
time.sleep(1) 

如果我通過價值get_arcs手動它的工作原理確定。
如果我手動通過oratab調用,它工作正常。
如果我合計這兩個功能結合在一起:

for i, y in zip(instance.get_arcs(), instance.oratab()): 
    print i, y 

它返回相同的結果兩次,即使它應該削減到最小的一個(這兩個列表是3元大) 所以,如果我呼籲所有那些沒有另一個函數的調用看起來不錯,但是如果它們在同一個腳本中執行,結果都是意外的(即使沒有zip())

回答

1

get_arcs()是一個生成器,oratab()不是。嘗試使用

zip(list(instance.get_arcs()), instance.oratab()) 
+0

我想:__for一個在(0,1,2):對於I,Y拉鍊(名單(instance.get_arcs(一)) ,instance.oratab()):print i,y__但它返回了第一個func可迭代的罰款,但第二個沒有被迭代:http://prntscr.com/et3dmg __orcl__是oratab的第一個元素,每當其他2個沒有被稱爲 – feedthemachine

+0

我寧願不迭代我的oratab函數,因爲它需要大量的代碼重構 – feedthemachine

1

最後我明白了:

for i, b in zip((0, 1, 2), instance.oratab()): 
    print list(instance.get_arcs(i)), b 
+0

我必須承認我有點困惑......我的回答實際上並不完全正確,那麼......我是對嗎?是否有可能不接受答案? – knitti

+0

list(instance.get_arcs())得到了訣竅:) – feedthemachine