2017-02-01 3 views
0

ファイルからデータを解析したいと思います。各行について、それぞれのデータを検証したいと思います。私はdaterate値が有効であることを確認する何もしない関数をデフォルトとする辞書のようなクラス

id|date|rate|notes 
1|2016-07-23|0.765|foo 
2|2016-07-23|0.432| 
1|2016-07-24|0.697|bar 

、と私は彼らがしていることを確認できる機能を持っています。ファイルの最初の数行は、このような何かを見ていることを想像してみてください。これらの関数は、入力が有効な場合は値を返し、そうでない場合はエラーをスローします。例えば:

def validate_date(string): 
    parts = [int(x) for x in string.split("-") 
    return datetime.date(*parts) 

私はidまたはnotesフィールドの値を気にしないでください。だから私はこれを行うことができます:私は(辞書として)各行に読んだ後、次に

validators = dict() 
validators['id'] = lambda x: x 
validators['date'] = validate_date 
validators['rate'] = validate_rate 
validators['notes'] = lambda x: x 

を私はそうのように、各フィールドを検証することができますすべての偉大である

output = dict() 
for key, value in line.iteritems() 
    output[key] = validators[key](value) 
return output 

。問題は、私が実際に解析したいファイルには、私が気にしない数十のフィールドがあり、私が行うほんの一握りのフィールドしかないということです。したがって、手動でvalidators['id'] = lambda x: xのような行を定義する代わりに、入力を返す関数を返すには、defaultdictのようなものを使用します。私がしようとした場合でも、:

def do_nothing(x): 
    return x 

foo = defaultdict(do_nothing) 
foo['bar'](1) 

私はエラーを取得:do_nothing() takes exactly 1 argument (0 given)

defaultdictのような何かを作成する方法はありますが、それは引数を取ることができますオブジェクトを返しますか?

+1

'lambda:do_nothing'と書いてみましたか? –

答えて

3

defaultdictは、デフォルトの関数で作成されたものを返します。do_nothingは、1つのパラメータを取る呼び出し可能なものを返すだけです。あなたは本当に、すべてであなたが

validators['foo'](1) 

を行うことができますので、一つのパラメータを受け取り、ラムダが1と呼ばれているだけで

validators = collections.defaultdict(lambda: lambda x: x) 

defaultdict戻りlambda x: xdo_nothingを必要としません。

+0

'lambda:lambda x:x'を使う必要がありますが、ありがとうございます。それが私の必要なものです。 – Batman

+0

@Batman - fixed – tdelaney

関連する問題