python / webapp2: Нарушение DRY повсеместно в калькуляторе на основе веб-форм ... как это исправить? - PullRequest
0 голосов
/ 31 декабря 2011

У меня есть модель макроэкономики на основе веб-формы здесь , которая принимает параметры и входные данные и решает систему линейных уравнений.

обработчик webapp2:

class Islm(webapp2.RequestHandler):
    def get(self):
        a = self.request.get('a')
        b = self.request.get('b')
        c = self.request.get('c')
        d = self.request.get('d')
        A = self.request.get('A')
        G = self.request.get('G')
        T = self.request.get('T')
        M = self.request.get('M')
        P = self.request.get('P')

        template_values = {
            'url': url,
            'url_linktext': url_linktext,
            'a': a,
            'b': b,
            'c': c,
            'd': d,
            'A': A,
            'G': G,
            'T': T,
            'M': M,
            'P': P
            }

        if a: # need to change to have a better validation test.
            kwargs = {'a': float(a),
                      'b': float(b),
                      'c': float(c),
                      'd': float(d),
                      'A': float(A),
                      'G': float(G),
                      'T': float(T),
                      'M': float(M),
                      'P': float(P)
                      }
            Y, E, r = islm(**kwargs)
            template_values['Y'] = float(Y)
            template_values['E'] = float(E)
            template_values['r'] = float(r)
        else:
            pre_solve = 'ENTER VALUES'
            template_values['Y'] = pre_solve
            template_values['E'] = pre_solve
            template_values['r'] = pre_solve

        template = jinja_environment.get_template('islm.html')
        self.response.out.write(template.render(template_values))

решатель:

import numpy as np


def islm(**kwargs):

    a = kwargs['a']
    b = kwargs['b']
    c = kwargs['c']
    d = kwargs['d']
    A = kwargs['A']
    G = kwargs['G']
    T = kwargs['T']
    M = kwargs['M']
    P = kwargs['P']

    matrix_a = np.matrix([[1,-1,0],
                          [-1*a,1,b],
                          [c,0,-1*d]],
                         dtype=float)

    matrix_b = np.matrix([[0, 1, 0, 0],
                          [1, 0, -1*a, 0],
                          [0, 0, 0, 1/P]],
                         dtype=float)

    matrix_c = np.matrix([[A],
                          [G],
                          [T],
                          [M]],
                         dtype=float)

    return np.dot(np.linalg.inv(matrix_a), np.dot(matrix_b, matrix_c))

Я знаю, что этот код отвратителен, я просто понятия не имею, как устранить СУХОЙ, требуемую сделать следующее для каждого параметра:

  1. Получить значение параметра изотправка http GET.
  2. Отправьте его в словарь значений шаблона.
  3. Если оно имеет значение, преобразуйте его в float, чтобы numpy знал, что с ним делать.
  4. Получить параметр в области видимости для решающей функции.

Спасибо.

1 Ответ

2 голосов
/ 31 декабря 2011

Вы можете начать с создания кортежей всех ваших входов и выходов:

input_vars = ('a', 'b', 'c', 'd', 'A', 'G', 'T', 'M', 'P')
output_vars = ('Y', 'E', 'r')

Вы также можете просто оставить template_values с несколькими значениями в нем и заполнить остальные динамически:

template_values = {
    'url': url,
    'url_linktext': url_linktext,
}

Теперь вы можете динамически создавать kwargs и заполнять template_values:

kwargs = {}
complete = True
for var in input_vars:
    template_values[var] = self.request.get(var)
    if var in self.request:
        try:
            kwargs[var] = float(self.request[var])
        except ValueError:
            # not a number
            complete = False
    else:
        # not provided
        complete = False

Здесь у нас также есть переменная complete; если все было предоставлено и было успешно проанализировано как число с плавающей точкой, complete будет True. Если что-то не было предоставлено или не удалось проанализировать как число с плавающей точкой, complete будет False.

Теперь мы можем запустить решатель:

if complete:
    output = islm(**kwargs)
    for var, value in zip(output_vars, output):
        template_values[var] = value
else:
    for var in output_vars:
        template_values[var] = 'ENTER VALUES'

Здесь, если он завершен, мы можем запустить решатель и затем поместить выходные значения в template_values. В противном случае мы просто устанавливаем для каждой переменной шаблона значение 'ENTER VALUES'.

Что касается вашего решателя, вам не нужно принимать **kwargs аргумент. Просто сделайте это:

def islm(a, b, c, d, A, G, T, M, P):
    matrix_a = # ...
    # ...
    return np.dot( # ...
...