2016-04-09 5 views
-2

質問:多くの外部データに依存する大きな関数をどのように構成するか。クラスを宣言し、それらの外部データを含める必要がありますか?大きな機能とそのデータを1つのファイルに保存する必要がありますか?または、それを行うためのより良い方法がありますか?最も計算効率の高い方法は何ですか?どのようなpythonic、推奨された方法は何ですか?Python、多くの外部データに依存する大きな関数を構成する方法

私は解析するログファイルを持っており、ログファイルには多くの形式の文字列が含まれています。すべての可能なフォーマットを処理するparseLine(inputStr)関数を書いた。 parseLine()関数は多くのプリコンパイルされた正規表現と検索のための非常に大きな辞書を必要とします。その後、mytimeCriteriaを決める、私のメインのコードでは

regex0 = re.compile('foo') 
regex1 = re.compile('bar') 
# and many more regexes 

set0 = {'f', '0'} 
set1 = {'b', 'a'} # could be a big set contains 10s of strings 
# and many more sets 

def parseLine(inputString, inputDictionary, inputTimeCriteria): 
    # pseduo code: 
    # use regex0 to extract date info in inputString 
    # check if date within inputTimeCriteria 
    # use more of previous declared regexes and sets to extract more info, 
    #  branch out to different routines to use more regexes and sets to extract more info 
    # finally use inputDictionary to look up the meaning of extracted info  
    # return results in some data structure 

、私はparseLineFile.py
ビルドmyDictionaryをインポートすると:私は私のparseLineFile.pyがどのように見える

parseLineFile.py

ファイルにparseLine()関数を保持しましたparseLine()を使用してファイルを1行ずつ解析します。

私は自分の質問がスタックオーバーフローicではないと感じていますが、狭い/具体的な質問をどのようにしなければならないかコメントしておきたいなら、それは素晴らしいことです!私の問題にどうやってアプローチするかについても言及してください。

+1

実際に関連ビットを表示していないときに、コードの計算効率を誰かが有効に議論できる人はいないと思います。 – Blckknght

+1

これはprogrammers.stackexchange.comの質問のようです。 – cphlewis

+0

それをすべて独自の.pyファイルに保存することは合理的な選択です。そのモジュールの名前空間に含まれています。独自のプライベートデータで複数のインスタンスを保持する必要がない場合は、クラスに移動する必要はありません。あなたが今持っているものに固執する。 – tdelaney

答えて

0

それは特にあなたがこの特定の機能のために何をすべきか、あなたを伝えるのは難しいですが、大きな機能を組織に関してはいくつかのヒント:

まず、条件文が独自の機能に移動することができるものを識別します。たとえば、あなたがこのコードを持っているとしましょう:

if 'foo' in inputString: 
    line = regex() 
    line = do_something_else() 
elif 'bar' in inputString 
    line = regex() 
    line = do_something_a_little_different() 

あなたが簡単にあなたがここに何ができる1つの抽象化を見ることができ、そしてそれはあなたがparseFooparseBarを作成しますので、独自の機能を各ifブロック内の機能を移動することです行を取り、期待値を返す関数

これの主な利点は、ユニットテストに非常に簡単な機能が追加されました。私は気をつけ

他のものは以下のとおりです。

  • はあなたが条件文の多くのネスティングを行いますか?精神的に翌日の機能をスキャンして、私はまだ非常に簡単にそれを得るかどうかを確認機能
  • に、あなたは異なる入力を自分で繰り返している場合は
  • ネスト減らす抽出するために、早期の機能とreturnに抽出します。そうでない場合は、より小さなビットに抽出します。

とにかく、あなたからのより多くの情報が理想的ですが、あなたが始めるのに役立つことを願っています!

+0

私はここに私の愚かさを見る...私は正しい方法を疑っていない。大きな機能を壊すためにあなたの助言をありがとう、私はそれが正しいことだと思う。私の質問はもっと似ています:私はこの関数をファイルではなく、クラスにする必要がありますか?正規表現のセットと辞書をクラスの内部変数として入れておくか、引数として渡すだけですか?または、この大きな機能を編成する他の可能性 – YunliuStorage

+0

@YunliuStorage:あなたのコメントは、これが良い質問ではない理由を正確に示しています。 – tom10

+0

私はこのコミュニティから得た最も "助け"が私の質問がどれほど悪い。良い質問は通常Googleが対応可能です。 – YunliuStorage

関連する問題