我想解析來自文件的數據,並且想要驗證每條數據的每一行。試想一下,該文件的前幾行是這個樣子:類似字典的類,默認爲不執行任何操作的函數
id|date|rate|notes
1|2016-07-23|0.765|foo
2|2016-07-23|0.432|
1|2016-07-24|0.697|bar
我想確保的date
和rate
值都是有效的,而且我有一個可以檢查它們的功能。如果輸入有效,這些函數會返回一個值,如果不是,則會拋出一個錯誤。 E.g:
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'嗎? –