2016-09-04 6 views
0

私が設計しようとしているプログラムでは、設定ファイルに特定の条件が存在するかどうかを確認しています。たとえば、次の行:ThisExistsがプログラムに含まれているか、またはThisIsFirstがファイル内に存在し、その後にが続きます。がファイルの後ろにあります。どのようにプログラムを構造化するべきかのアドバイス

私はこの状況で使用される可能性のある効率的なアプローチを探しましたが、何も見つかりませんでした。

私の現在のアイデアは、基本的に、条件をチェックするたびにファイルを複数回反復するだけです。だから私は機能を持っているでしょう:

デフcheckA(ファイル)

デフcheckB(ファイル)

。 。 。

私には、私がチェックしたいすべての条件について反復する必要があるので、これは非効率的なようです。

最初は、検証したいすべての条件について各行をチェックするだけで1回だけ繰り返すことができたと思っていました。しかし、複数行になる可能性のある条件は、一度に複数の行についての情報を必要とするため、私はそれを行うことはできないと私は思っています。

これを行うための唯一の方法を概説した方法ですか、より効率的な方法がありますか?

私は以下の例を提供しようとしています。

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

基本的には、ファイルをたくさん解析しなければならない場合は、個々の関数で複数回の解析に分割するか、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

ソフトウェアエンジニアリングの観点からは、現在のアプローチにはいくつかの優れた利点があります。これらの機能のロジックは完全に分離されており、個別にデバッグしてテストすることができます。個々の機能の複雑さは低いです。また、このアプローチでは、並列構造を持たないさまざまなチェックを簡単に組み込むことができます。

関連する問題