2015-09-23 43 views
0

我寫了一個腳本,你基本上可以減少到以下幾點:如何在python中保存一個函數作爲輸入參數?

def Readhtml(a,b): 
    read some values from an html file 
    return a list of values 

def ReadSQL(a,b): 
    Read some values from an SQL Database 
    return a list of values 

def mainfunction(Variable): 
    result = Variable['Readfunction'](Variable['Parameter1'],Variable['Parameter2']) #Variable['Readfunction'] is the function Readhtml or ReadSQL 
    return result 

其中Variable是作爲組輸入參數的字典。

其中一些輸入參數是用來讀出數值或對數據進行操作的函數。我有很多不同的變量(大約1000),每個變量都有一個字典關聯。只要我在我的腳本開頭定義我的輸入字典,一切正常。但我希望能夠重用這些字典,並將它們保存爲/多個人類可讀和可寫入的輸入文件/輸入文件。問題是我不知道如何保存/閱讀字典條目Variable['Readfunction']在這種方式python明白它不只是一個字符串,但我希望使用我的腳本中定義的函數。

因此,我有兩個問題:

  1. 我可以只寫一個骯髒的解決方法,節省了變量[「Readfunction」]作爲字符串的文件時,重讀它作爲字符串寫入匹配功能名稱的功能字符串到函數。有沒有更好的辦法?
  2. 整個建築是否無意義?我是否應該以完全的其他方式來構建它以避免這個問題?我不是一個程序員,所以你應該如何以適當的方式來做這樣的事情?該程序已經複雜到完全重寫,所以這更多的是關於下次學習。

回答

1

這就是pickling和對象序列化的用處。

Documentation of pickle library

示例代碼: -

import cPickle as pickle 

variable = {'read_function': ReadHtml, 'Parameter1': 'abc'} 
dump = pickle.dumps(variable) 

# store dump in somewhere 

variable = pickle.loads(dump) 

PS - 您的命名約定使我的眼睛受傷了。通過pep 8 guidelines

+0

OP說他希望文件是人類可讀的。 「pickle」文件不是這樣,是嗎? – saulspatz

0

將定義移動到另一個腳本並導入該腳本。這個問題的難點在於名稱。如果你調用腳本說,「definitions.py」,並在你的腳本的頂部,你寫

import definitions as defn 

,那麼你就不得不提及的變量作爲defn.Readhtml等等。您可以使用

from definitions import * 

,然後你不必限定名稱,但「瘋狂這樣的謊言」,因爲你不能告訴其名其模塊中定義。

所以,這將做你想要的,我認爲,但可能需要大量的重寫,這取決於你的腳本是什麼樣子。

相關問題