2011-01-26 9 views
1

私は現在、automagic djangoモデルのインスタンシエータを作成しようとしています。この関数はいくつかの引数をとり、いくつかのdjangoモデルをインスタンス化し、いくつかの外部キーをリンクして、たくさんを保存し、メインモデルを私に返します。これはすべて正常ですが、最終的には関数は4つの通常の引数と2つのタプル(contenttype名と異なる関数呼び出しの引数配列で埋められます)をとります。ボイラープレート機能で引数の量を減らすことは可能ですか?

これはデフ次の関数につながる:

def create_rule(profile, lifestyles, bool, title, input, output): 
    rule = Rule.objects.create(
     user_profile=profile, 
     lifestyles=lifestyles, 
     bool=bool, 
     title=title, 
    ) 

    models = ContentType.objects.filter(app_label="rules") 
    input_cls = models.get(model=input[0]).model_class() 
    input_cls.objects.create(*input[1], rule=rule) 

    output_cls = models.get(model=output[0]).model_class() 
    output_cls.objects.create(*output[1], rule=rule) 

    return rule 

平均関数呼び出しは少しこのようなものになります。

create_rule(profile, '1,3,6,7', 1, "Switch off when 5:00", 
    ('eventruleinput', [5, 'start']), 
    ('propruleoutput', [35, 'Switch', 0])) 

は、引数の量を減らすための良い方法はありますI私は本当に私は推測しないで使用していますか?この関数呼び出しを構造化するより良い方法はありますか?私はこれを完全に間違った方法でやっていますか?

注:これはモックアップの実装に過ぎません。私はこのような問題にアプローチしたいと思っています。

+0

それが自動化されている場合設定ファイルからパラメータを受け取るコードの場合、問題はありませんが、これらのパラメータを記述しなければならないプログラマなら、それは正解(IMHO)ではないかもしれません。私はここで私の頭の上に行く場合はpythonので申し訳ありません。 –

答えて

2

時々、関数は多くの引数を取る必要があります。これには何も問題はありません。それ自体はです。 「ブール」、ブール値に名前を付けないでください

:ここで少しクリーン作る上でいくつかのヒントがあり

def create_rule(profile, lifestyles, is_something, title, input, output): 
    rule = Rule.objects.create(
    .... 
    bool=is_something, 
) 

は、明確にするために、あなたのタプルを解凍します。

input_val, input_command = input 
input_cls = models.get(model=input_val).model_class() 
input_cls.objects.create(*input_command, rule=rule) 
output_val, output_command, output_third_arg = output 
.... 
+0

タプルのアンパックと変数名に関する良い点。私はもうちょっとこのような答えを期待していました。 – Exelian

関連する問題