2011-12-31 1 views
0

私は、ウェブフォームベースのマクロ経済モデルhereを持っており、パラメータと入力を受け取り、線形方程式のシステムを解きます。python/webapp2:webformベースの電卓のどこにでもDRYを違反しています...どうすれば修正できますか?

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)) 

私はこのコードは嫌ですけど、私はどのように各パラメータの次の操作を実行するために必要なDRYを除去するためには考えています

  1. http GET送信からパラメータ値を取得します。
  2. テンプレート値辞書に送信します。
  3. 値がある場合はfloatに変換し、numpyはその処理方法を認識します。
  4. ソルバ関数のスコープ内のパラメータを取得します。

ありがとうございます。

答えて

2

あなたの入力と出力のすべてのタプルを作ることから始めることができます。

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もあります。すべてが提供され、浮動小数点として正常に解析された場合、completeTrueになります。何かが提供されなかったか、浮動小数点として解析されなかった場合、completeFalseになります。それは完全かどう

ここ
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(# ... 
+0

素晴らしいです。心から感謝する。 – MikeRand

+0

小さなnit:self.requestは、辞書とは少し異なるAPIを持つWebOb Requestオブジェクトです。したがって、self.request.GETとself.request [var]のvarがself.request.get(var)になると、self.requestのvarがなる場合。 – MikeRand