2016-09-04 63 views
0

對於我試圖設計的程序,我檢查配置文件中是否存在某些條件。例如,行:ThisExists是在程序中,或者ThisIsFirst存在於該文件中,然後ThisAlsoExists某處以後在文件中。關於如何構造程序的建議

我尋找一種有效的方法,可能在這種情況下使用,但找不到任何。

我目前的想法基本上是每次我想檢查一個條件時多次迭代文件。因此,我將擁有的功能:

高清checkA(文件)

高清checkB(文件)

。 。 。

對我來說,這似乎效率低下,因爲我必須迭代我想檢查的每個條件。

最初我以爲我可以迭代一次,檢查每條線我想要驗證的每個條件。但我不認爲我可以這樣做,因爲可能多行的條件一次需要關於多行的信息。

我是如何描述這樣做的唯一方法,還是有更高效的方法?

我想在下面提供一個例子。

def main(): 
    file = open(filename) 
    result1 = checkA(file) 
    result2 = checkB(file) 

    """This is a single line check function""" 
    def checkA(file) 
     conditionExists = False 
     for line in file: 
      if(line == "SomeCondition"): 
       conditionExists = True 
     return conditionExists 

    """This is a multi line check function""" 
    def checkB(file) 
     conditionExists = False 
     conditionStarted = False 
     for line in file: 
      if(line == "Start"): 
       conditionStarted = True 
      elif(line == "End" and conditionStarted): 
        conditionExists = True 
     return conditionExists 
+0

你能否給我們提供一個例子? – karlosss

+0

對不起,現在編輯我的問題,而不是試圖把它放在這裏。 – Handcre

+1

基本上我問的是如果你必須做大量的文件解析,你應該把它分解成多個單獨的函數解析,或者嘗試在一個複雜的函數中完成解析?該函數的複雜性是否值得從多輪解析中節省時間? – Handcre

回答

0

如果可用的庫(configparser等)是不夠的我可能會使用正則表達式。

import re 

check_a = re.compile('^SomeCondition$', flags=re.MULTILINE) 
check_b = re.compile('^Start(?:.|\n)*?End$', flags=re.MULTILINE) 

def main(file_name): 
    with open(file_name, 'r') as file_object: 
     file_content = file_object.read() 

    result_1 = bool(check_a.search(file_content)) 
    result_2 = bool(check_b.search(file_content)) 

這不是對用戶最友好的方式 - 特別是如果匹配條件是複雜的 - 但我認爲在發放學習正則表達式是巨大的。

xkcd告訴我們,正則表達式都可以是super powerproblem

1

從軟件工程的角度來看,您目前的方法有一些很好的優點。這些功能的邏輯完全相互解耦,可以單獨進行調試和測試。每個單獨功能的複雜性都很低。這種方法使您可以輕鬆地合併不具有並行結構的各種檢查。