2016-09-04 26 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

从软件工程的角度来看,您目前的方法有一些很好的优点。这些功能的逻辑完全相互解耦,可以单独进行调试和测试。每个单独功能的复杂性都很低。这种方法使您可以轻松地合并不具有并行结构的各种检查。