2017-02-12 13 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. をファイルを二度読みください。オブジェクトを初めて作成し、2回目にリンクを構築します。しかし、二度読むことは醜いようです(そして、標準ではうまくいかないでしょう)。

  2. すべてのオブジェクトをテキストリンクで作成します。その後、すべてのオブジェクトをスキャンして、テキストリンクをオブジェクト参照に置き換えます。

  3. ターゲットが存在しない場合は、プレースホルダオブジェクトを作成します。次に、その行が読み込まれるときにプレースホルダに記入します。しかし、リンクの不足をチェックしたい場合、別のパスを作る必要があります。

私はこれを行うための共通のPythonのイディオムがあると思うので、私は過度に複雑なことを避けたいと思います。また、オブジェクトクラスでこのグラフの作成を処理するのが最もクリーンですか、別のパーサークラスが必要ですか?維持

(私のオブジェクトはもちろん、削ぎ落とした例よりも複雑です。とりわけ、それが違いを作る場合、私は、接続されたコンポーネントを見つけるために計画しています。)

あなたが持っている可能性が

答えて

1

クラス属性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 
関連する問題