ファイルからデータを解析したいと思います。各行について、それぞれのデータを検証したいと思います。私はdate
とrate
値が有効であることを確認する何もしない関数をデフォルトとする辞書のようなクラス
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
のような何かを作成する方法はありますが、それは引数を取ることができますオブジェクトを返しますか?
'lambda:do_nothing'と書いてみましたか? –