2016-04-06 101 views
4

我有這樣的代碼:如何將參數名稱作爲參數傳遞?

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

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 

完全一樣的代碼,只上場改變名稱。所以,我想提出一個通用的功能,並調用它像這樣:

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

@Sayse你可以說,如果你討厭我的膽量出於某種原因。和不。它更多。看看第一塊。他不知道從'(a,b,c)'收集'c'爲'(...,c = c)' –

相關問題