2015-09-23 4 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»] в виде строки в файл, перечитайте его как строку и написать функцию, соответствующее имя функции string к функции. Есть ли способ лучше?
  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 * 

, и тогда вы не должны квалифицировать имена, но «Таким образом лжет безумие», потому что вы не можете сказать, какие имена определены в каком модуле.

Таким образом, это будет делать то, что вы хотите, я думаю, но может потребовать существенной перезаписи, в зависимости от ваших сценариев.

Смежные вопросы