如何在python中将函数保存为输入参数?

时间:2015-09-23 15:31:13

标签: python function dictionary file-io

我编写了一个基本上可以简化为以下内容的脚本:

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. 我可以编写一个脏的解决方法,将Variable ['Readfunction']作为字符串保存到文件中,将其重新读取为字符串并将函数名称字符串与函数匹配。还有更好的方法吗?
  2. 整个架构是否毫无意义?我应该以完全其他方式构建它以避免这个问题吗?我不是那么优秀的程序员,所以你应该如何以正确的方式做这样的事情呢?该程序已经很复杂,需要完全重写,所以这更多是关于下次学习。

2 个答案:

答案 0 :(得分:2)

这就是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

答案 1 :(得分:0)

将定义移动到另一个脚本并导入该脚本。这个问题的难点在于名称。如果你打电话给脚本说," definitions.py"并在脚本的顶部写下

import definitions as defn

然后您必须将变量称为defn.Readhtml,依此类推。你可以使用

from definitions import *

然后你不必对这些名字进行限定,但是"那种疯狂的谎言,"因为你无法分辨在哪个模块中定义了哪些名称。

所以我认为这会做你想要的,但可能需要大量的重写,这取决于你的脚本是什么样的。