2017-02-12 55 views
1

我有一個表示對象及其互連的文本文件,並且我想構建相應的Python對象結構,但我不確定什麼是最好的處理循環依賴的方法。如何從文本文件中創建Python對象圖(具有循環依賴關係)

爲了使這個具體的,假設我有一個文件:

a: b, c, other info for creating a 
b: a, c, info... 
c: a, d, info... 
d: a, b, info... 

我想創建對象A,B,C,d,其中A.link1 = B,A.link2 = C等等。問題是,當我分析的第一線,畫線B和C是不存在的,所以我不能把他們在A.

幾個備選方案:

  1. 讀取文件的兩倍。第一次創建對象,第二次創建鏈接。但是,兩次閱讀看起來很醜陋(並且不會與stdin一起使用)。

  2. 使用文本鏈接創建所有對象。然後掃描所有對象以用對象引用替換文本鏈接。

  3. 如果目標不存在,則創建一個佔位符對象。然後在讀取其行時填寫佔位符。但如果我想檢查缺失的鏈接,我需要再次通過。

我懷疑這樣做有一個共同的Python成語,我想避免過分複雜的事情。另外,讓我的對象類處理這個圖創建,還是應該有一個單獨的解析器類,是否最清晰?

(我的對象是比簡裝的例子更復雜,當然,別的不說,我打算找到連接的部件,如果有差別。)

回答

1

你可以有class屬性dicts維持實例和標籤鏈接。然後你可以實現link1link2作爲屬性:

class Node(object): 
    links = {} 
    registry = {} 

    def __init__(self, label, *link_labels): 
     self.label = label 
     self.links[label] = list(link_labels) 
     self.registry[label] = self 

    @property 
    def link1(self): 
     try: 
      return self.registry[self.links[self.label][0]] 
     except (KeyError, IndexError): 
      return None 

    def __str__(self): 
     return 'Node: ' + self.label 

> a = Node('a', 'b', 'c') 
> b = Node('b', 'a', 'c') 
> c = Node('c', 'a', 'd') 
> d = Node('d', 'a', 'b') 

> print(a.link1) 
> print(b.link1) 
> print(c.link1) 
> print(d.link1) 

Node: b 
Node: a 
Node: a 
Node: a