2016-03-17 36 views
0

我有許多'進程',每個實現爲一個類(實現一個接口 - process)和一些'數據集',再次由一個類dataset表示。在網絡中生成並執行處理圖表

有向數據集及其依賴條件的無環圖可created..It可能看起來像:

  root 
     / \ 
    dataset1a  dataset1b 
    |    | 
    dataset2  dataset2b 
/ | \  / \ 
dset3a | dset3b dset4a dset4b 
    \ |  /
    \ |  /
    \ | /
    dataset3a4a 

要到每個數據集,處理(由process類表示)必須被施加。目前,我正在使用網絡x創建DiGraph,其中每個數據集對象都是一個節點,並且要獲取到X節點的過程是節點上指向該對象的屬性。 ROOT只是一個提供起始節點的虛擬節點。

這是用networkx表示圖形的好方法嗎? 鑑於dataset1adataset1b存在及其decendants必須創建(其中每個數據集以前是輸入到process類)...什麼是遍歷圖這樣的一個好辦法:

  • 一個節點沒有訪問,直到所有的家屬已被訪問(以及因此創建的數據集)
  • 可以找到依賴的「節點」...例如如果我在dataset3a4a節點上,我必須能夠發現所有'輸入'來創建該數據集 - dset3a,dset4adataset2

回答

0

Python提供了一些可以用來代替networkx的內省工具。 的__subclasses__方法返回給定類的直接subclasess的列表:

In [36]: Root.__subclasses__() 
Out[38]: [__main__.DataSet1a, __main__.DataSet1b] 
In [61]: DataSet2.__subclasses__() 
Out[61]: [__main__.DSet3a, __main__.DSet3b, __main__.DataSet3a4a] 
In [62]: DataSet3a4a.__subclasses__() 
Out[62]: [] 

__bases__屬性返回類的鹼(直接父類):

In [63]: DataSet3a4a.__bases__ 
Out[63]: (__main__.DSet3a, __main__.DataSet2, __main__.DSet4a) 

__bases__屬性提供回答關於 的第二個問題如何找到創建數據集的輸入。

要回答第一個問題,你可以使用__subclasses____bases__到 建立自己的穿越功能:

import collections 
class Root(object): pass 
class DataSet1a(Root): pass 
class DataSet1b(Root): pass 
class DataSet2(DataSet1a): pass 
class DataSet2b(DataSet1b): pass 
class DSet3a(DataSet2): pass 
class DSet3b(DataSet2): pass 
class DSet4a(DataSet2b): pass 
class DSet4b(DataSet2b): pass 
class DataSet3a4a(DSet3a, DataSet2, DSet4a): pass 

def visit(cls): 
    seen = set([cls]) 
    queue = collections.deque(cls.__subclasses__()) 
    while queue: 
     subcls = queue.popleft() 
     if subcls in seen: continue 
     # check that all its bases have been seen 
     for base in subcls.__bases__: 
      if base not in seen: 
       # if a base has not been seen, push subcls to the back of the queue 
       queue.append(subcls) 
       break 
     else: 
      # all the bases of subcls have already been seen 
      seen.add(subcls) 
      yield subcls 
     # add all the subclasses of subcls to the queue 
     queue.extend(subcls.__subclasses__()) 

for cls in visit(Root): 
    print(cls.__name__) 

產生

DataSet1a 
DataSet1b 
DataSet2 
DataSet2b 
DSet3a 
DSet3b 
DSet4a 
DSet4b 
DataSet3a4a