3

私は Python を初めて使用します。これは、醜い小さな put-this-tabular-data-into-a-db 変換を行うために使用しています。プログラムはデータを見て、MySQL にテーブルを作成し、データをテーブルに読み込みます。このセクションでは、ヘッダー行のテキストをチェックして、データ型に関する決定を下します。if/elif ではなく、単一の正規表現でこれを行うことができるというアイデアがありました。私の解決策は、少なくともこのケースでは機能します。複数の一致について心配する必要はありません。私が求めているのは、効率の点でこのアプローチに実際のメリットはありますか?

def _typeMe(self, header_txt):
    # data typing
    colspecs = {
        'id':'SMALLINT(10)', 
        'date':'DATE', 
        'comments':'TEXT(4000)',
        'flag':'BIT(1)', 
        'def':'VARCHAR(255)'
    }
    # regex to match on header text e.g. 'Provisioner ID'
    r = re.search(re.compile('(ID$)|(Date)|(Comments$)|(FLAG$)', re.IGNORECASE), header_txt)
    checktype = lambda m: max(m.groups()).lower() if m else 'def'
    return colspecs[checktype(r)]
4

2 に答える 2

2

絶対; あなたが持っているものはデータ駆動型プログラミングと呼ばれています。コードセクションの重複を気にせずに簡単に変更できるので、一般的には良いスタイルです。

パフォーマンスの面では、大きな違いはありそうにありません。重要なことは、他の方法よりも読みやすく保守しやすいということです。

于 2012-07-31T16:33:56.453 に答える
1

@ecatmur の回答に同意します。コメントするには少し長すぎるコードの提案をいくつか投稿したかっただけです。

する必要はありませんre.search(re.compile('...', re.IGNORECASE), header_text)。代わりに、文字列をそのまま as に渡すことができますre.search('...', header_text, re.IGNORECASE)。同じ正規表現を何度も使用している場合re.compileは高速ですが、使用re.searchしていない場合は友人が呼び出します。

名前付きラムダに対する Colin の軽蔑は共有しませんが (2 行ではなく 1 行であるため便利です)、ここでは内部関数はまったく必要ありません。

return colspecs[max(m.groups()).lower() if m else 'def']

max(m.groups())キャプチャ グループを 4 つではなく 1 つだけ作成する場合も、このトリックは必要ありません'(ID|Date|Comments|Flag)$'。その後、行うことができますm.group(1)

于 2012-07-31T17:32:36.223 に答える