2013-07-02 35 views
0

我想設計一個包含類的組合模式。 假設我們有一堂課。正確的Python語法的建議

class Node(object): 
    def __init__(self,a,b): 
     self.a = a 
     self.b = b 

現在我想設計一個配置模式,我想要定義像這樣或這樣的變體。

Workflow = Node(1,2) & (Node(4,2) | Node(5,6)) & Node(1,7) 

其實我是想將其保存在一個文件,然後再拿起這件事,然後打破所有節點,並以相同的順序將它們用作這裏定義。 但這是語法不正確。 你能爲我推薦一些替代方案嗎? 我可以使用上面定義的相同模式嗎?

我不想使用字典和列表來保存它們,因爲它們只提供','作爲分隔符。字典也沒有排序,我將放棄定義配置或節點的順序。

+1

'collections.OrderedDict' PRES。順序。您可以使用像['pickle']這樣的模塊(http://docs.python.org/2/library/pickle.html)將實際的python對象存儲在文件中(以字節形式)並稍後將它們加載到內存中。 –

+0

感謝您回覆@AshwiniChaudhary 我知道OrderedDict,但我真的想要避免字典。 我的主要目標是設計或配置模式。 我想知道如果可以使用上面定義的設計,如果不能,最好的辦法是什麼。 我主要關注的是那些'&'和'|'的分隔符。 由於配置將成爲工作流的路由,其中​​'&'定義了必需的節點,'|'可選。 –

+1

@HardikJuneja我喜歡你嘗試爲此製作DSL的方法,但是在使用'&'和'|'之前,你可能想再想一想,代表必需和可選。重載操作員時,應始終嘗試並確保行爲直觀。這兩個操作符的含義在程序員中是根深蒂固的,意思是「和」和「或者」,如果他們被重新定義爲「需要」和「可選」,則可能會混淆人。 – robjohncox

回答

1

如果您希望能夠支持從Node開始構建Workflow的語法,那麼您應該可以使用運算符重載完成此操作。這是Python中極好的quick reference on operators that can be overloaded

正如@AshwiniChaudhary所建議的那樣,pickle模塊可以將Python對象存儲在文件中。

0

不確定從你的問題,但如果重點是存儲任意配置樹我建議你堅持「正常」的數據類型,如果可能的話。這樣你的配置數據將更容易存儲並且更加便攜。

關於語義和順序,你總是可以做這樣的事情(有點類似Lisp的東西):

conf = [ 
    ['Workflow', 
     ['and', 
      ['Node', 1, 2], 
      ['or', 
       ['Node', 4, 2], 
       ['Node', 5, 6] 
      ], 
      ['Node', 1, 7] 
     ] 
    ] 
] 

如果這是你的人太醜陋了,你可以在覈心使用YAML(不Python的庫雖然;使用PyYaml):

- - Workflow 
    - - and 
    - [Node, 1, 2] 
    - - or 
     - [Node, 4, 2] 
     - [Node, 5, 6] 
    - [Node, 1, 7] 

(請注意,我用小寫爲運營商和第一大寫字母類)