2016-04-06 20 views
4

私はこのコードを持っている:引数名をパラメータとして渡す方法は?

programmes2 = form.cleaned_data.pop('programmes2') 
PersonneProgramme.objects.filter(personne=obj).delete() 
for pk_str in programmes2: 
    try: 
     programme2 = TagTraduit.objects.get(pk=int(pk_str)) 
     p = PersonneProgramme.objects.create(personne=obj, 
              programme=programme2) 
     p.save() 
    except ValueError: 
     break # hack = tout stopper 
    except LookupError: 
     break # hack = tout stopper 

全く同じコード、フィールドの変更の名前のみ:

hobbies2 = form.cleaned_data.pop('hobbies2') 
PersonneHobby.objects.filter(personne=obj).delete() 
for pk_str in hobbies2: 
    try: 
     hobby = TagTraduit.objects.get(pk=int(pk_str)) 
     p = PersonneHobby.objects.create(personne=obj, 
             hobby=hobby) 
     p.save() 
    except ValueError: 
     break # hack in the POST 
    except LookupError: 
     break # hack in the POST 

私は4つの異なる分野、programmeとexempleに同じコードを持つことになります。だから私は、一般的な機能をしたいと、このようにそれを呼びたい:

def update_field(post_field, class_field, **kwargs): 
    try: 
     values = form.cleaned_data.pop(post_field) 
     class_field.objects.filter(personne=obj).delete() 
     for pk_str in values: 
      try: 
       v = TagTraduit.objects.get(pk=int(pk_str)) 
       p = class_field.objects.create(**{'personne': obj, 
                field_name: v}) 
       p.save() 
      except ValueError: 
       break # hack = tout stopper 
      except LookupError: 
       break # hack = tout stopper 
    except KeyError: 
     pass 
update_field('programmes2', PersonneProgramme, 'programme') 
update_field('hobbies2', PersonneHobby, 'hobby') 

私の主な問題は、データベース内のレコードを作成するときに使用するフィールドの名前で最後のパラメータです。

どうすればよいですか?あなたがこれを行うことができます

答えて

4

をあなたはキーワード引数(**)のarbitary数でそれを行うと、関数内で計算され、追加のパラメータを挿入することができます:

def update_field(field, update_this, **kwargs): 
    ... 
    kwargs[update_this] = TagTraduit.objects.get(pk=int(pk_str)) 
    p = field.objects.create(**kwargs) 
    ... 

をこれはあなたのことができますそのように呼び出す:

update_field(PersonneHobby, 'hobby', personne=obj) 
update_field(PersonneProgramme, 'programme', personne=obj) 
3

def update_field(..., field_name): 
    ... 
    tag = TagTraduit.objects.get(pk=int(pk_str)) 
    p = PersonneProgramme.objects.create(**{'personne': obj, field_name: tag}) 
+0

私はkwargsからを使用して、私の質問を更新しました、あなたは私が何を意味するかわかります。 –

1

@MSeifertが言ったことと一緒に行くつもりです。あなたが書いたことが何であっても働くことを望むなら、私はポジションの引数だけで意味します。

def f(a,b,c): 
    a.func(b=b, c=c) # this is perfectly legal 

しかし、それについて移動する良い方法があり、

def f(a, **kwargs): 
    a.func(**kwargs) # kwargs is passed as a dict. **kwargs is 
         # unpacking it into key1=val1, key2=val2, ... 
+0

私はkwargsを使って私の質問を更新しました。 –

+1

これはちょうど "私は同意"の答えではありませんか?.. – Sayse

+0

@言い訳あなたが何らかの理由で私の腸を憎むなら、あなたはそれを言うことができます。そして、いいえ。もっとです。最初のブロックを見てください。彼は '(a、b、c)'から '(...、c = c)'として 'c 'を集めることについては確信していませんでした –

関連する問題