2015-05-24 90 views
0

基本上我想要做的是實現依賴關係解析算法。從文本輸入創建對象及其引用,而不會丟失信息

假設我有類似下面的列表:

package1: 
package2: package1 
package3: package1, package2 
package4: package1 
package5: package1, package2 

基本上,package1僅僅依賴自身,package2取決於package1package3取決於1和2,依此類推。

我做了什麼直到現在如下:

  • 首先,我打開包含列表
  • 二讀每一個文件的Word中的文件,把它在列表上
  • 三,我的列表內進入,如果該元素與:結束我創建一個對象以他的名字(意味着它的一個包中)

假設我與列表運行程序上面時,輸出是等這樣的:

<__main__.Node object at 0x100740ac8> 
<__main__.Node object at 0x100740b00> 
None 
<__main__.Node object at 0x100740ac8> 
None 
None 
<__main__.Node object at 0x100740b00> 
None 
<__main__.Node object at 0x100740ac8> 
None 
None 

在哪裏建立新的包對象的工作很好,因爲我們可以看到有物體,但在這裏我引用與主包的依賴關係的部分出現故障,因爲它顯示None的一部分,這是不正確。

爲了正確,輸出應該像下面

package1 
package2 
package1 
package3 
package1 
package2 
package4 
package1 
package5 
package1 
package2 

我認爲這是我正在做的錯誤是這樣的部分:

f = open('data.txt','r') 


text = [] 
resolved = [] 
unresolved = [] 

for line in f.readlines(): 
    for char in line.split(): 
     text.append(char) 



class Node: 

    def __init__(self, name): 
     self.name = name 
     self.edges = [] 

    def addEdge(self, node): 
     self.edges.append(node) 

    def dep_resolve(self, resolved, unresolved): 
     unresolved.append(self) 
     print (self.name) 
     for edge in self.edges: 
      if edge not in resolved: 
       if edge in unresolved: 
        raise Exception('Circular') 
       edge.dep_resolve(resolved, unresolved) 
     resolved.append(self) 
     unresolved.remove(self) 

global flag 
for i in range(len(text)): 
    if text[i].endswith(':'): 
     newstr = text[i].replace(':', '') 
     newstr = Node(newstr) 
     flag = newstr 
     print(flag.name) 

    else: 
     flag.addEdge(text[i]) 
     print(flag.addEdge(text[i])) 

,特別是else哪裏我引用str類型的對象,而我應該引用Node類型的對象,但我不知道如何解決該問題。

如果你需要更多的代碼我就會把它

+0

你似乎至少有兩個問題在這裏。首先,你打印出'<__ main __。Node object in 0x100740ac8>'你想要'package1'的地方,大概是因爲你要麼缺少'__str__'或'__repr__'方法,或者忘記了'.name'屬性。其次,你要在第二個'package'的地方打印'None',大概是因爲一些引用是錯誤的。你需要哪一個幫助? – abarnert

+0

第二個!我知道我正在打印'''<__ main __。0x100740ac8>的節點對象'''但它只是顯示對象,所以如果你能幫我解決第二個問題,我將不勝感激! – BioShock

+0

無論如何,請不要給我們一段代碼,而是讓我們猜測輸入和上下文的其他部分,請給我們一個[最小,完整,可驗證的例子](http://stackoverflow.com/help/) mcve) - 我們可以運行一些東西,看看有什麼不對。這可能意味着一行6行精簡的'None'類和'text'列表的值以及有關'flag'的東西被刪除,因爲它不相關,但很難猜測。 – abarnert

回答

1

我不明白你的代碼是如何工作的,因爲有很多作品是沒有意義的。不過,我可以多解釋:

你打印出來None原因是這樣的:

flag.addEdge(text[i]) 
print(flag.addEdge(text[i])) 

第一個電話addEdge

第二次再次調用addEdge,這看起來不對,而print是它的返回值。由於它沒有return語句,因此該值爲None

我想你想要的是:

flag.addEdge(text[i]) 
print(text[i]) 

同時:

...我引用類型海峽的目標,而我應該參考Node類型的對象,但我不知道如何修復它

如果你只是想創建一個Node對象在這裏,你這樣做,你做它幾個l ines更早:

new_node = Node(text[i]) 
flag.addEdge(new_node) 
print(new_node) 

我不知道這會給你什麼,但它會解決你描述的問題。

0

您使用nexstr不一致。

看這個部分:

newstr = text[i].replace(':', '') 
newstr = Node(newstr) 
flag = newstr 
print(flag.name) 

隨着newstr = text[i].replace(':', '')你實際分配newstr = ''。 然後,您將實例化具有空字符串''作爲參數的節點,並將其再次分配給newstr,因此newstr引用對象(Node類),而不是字符串。 比您將此對象重新分配至flag

首先,確保newstr確實包含您想要的內容。 然後

flag = Node(newstr) 
print(flag.name) 

應工作(我沒有測試過,雖然)

相關問題