2017-02-01 25 views
0

我想解析來自文件的數據,並且想要驗證每條數據的每一行。試想一下,該文件的前幾行是這個樣子:類似字典的類,默認爲不執行任何操作的函數

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

我想確保的daterate值都是有效的,而且我有一個可以檢查它們的功能。如果輸入有效,這些函數會返回一個值,如果不是,則會拋出一個錯誤。 E.g:

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

我不關心idnotes字段的值。所以,我可以這樣做:

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返回一個需要一個參數的可調用對象。你並不真的需要do_nothing所有,只是

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

現在defaultdict回報lambda x: x這需要一個參數,所以你可以做

validators['foo'](1) 

和拉姆達被調用1

+0

我需要使用'lambda:lambda x:x',但是謝謝。這就是我需要的。 – Batman

+0

@Batman - 修復 – tdelaney

相關問題