2017-07-03 41 views
0

這可能有一個很好的解決方案,但我正在爲此苦苦掙扎。 我有3個幾乎相似的函數,我想重構爲一個。在Python範圍之外替換對象的名字

這裏的功能:

def delete_labels_replication_controller(provider, obj_type): 
    obj_label_list = [] 
    obj_type_list = provider.mgmt.list_replication_controller() 

def delete_labels_node(provider, obj_type): 
    obj_label_list = [] 
    obj_type_list = provider.mgmt.list_node() 

def delete_labels_image(provider, obj_type): 
    obj_label_list = [] 
    obj_type_list = provider.mgmt.list_image() 

現在,正如你看到的,唯一改變的是provider.mgmt.xxx類,並根據我想傳遞到函數的OBJ_TYPE變化。 問題是如何僅爲它們使用1個函數,並僅替換該對象的.xxx部分? 謝謝!

+0

在問題中沒有說明,但我有理由認爲在這兩行之後會出現更多內容嗎?因爲否則,這三種功能都沒有做任何事情。 –

+0

是的,還有更多。我只是留下什麼與我的問題相關 –

回答

1

我肯定有一個更好的解決方案,但也許使用getattr這樣嗎?

def delete_labels_by_type(obj_type): 
    obj_type_list = getattr(provider.mgmt, obj_type)()  
    return obj_type_list 
0

做這樣

def myFunction(provider, obj_type, flag_type) 
    obj_label_list = [] 
    if flag_type == 1: 
     obj_type_list = provider.mgmt.list_replication_controller() 
    elif flag_type == 2: 
     obj_type_list = provider.mgmt.list_node() 
    elif flag_type == 3: 
     obj_type_list = provider.mgmt.list_image() 
+0

這是可能的,但我認爲有更好的解決方案。 –

+0

__DONT__「do like this」,there __is__ a better better solution。 –

0

你可以只通過該obj_type_list作爲另一個參數功能:

def delete_labels(provider, obj_type, obj_type_list): 
    obj_label_list = [] 
    ... 

,然後調用這樣delete_labels(provider, obj_type, provider.mgmt.list_replication_controller())(如果這是你需要的provider參數唯一的一次,你可以將其刪除完全)

或者傳遞到吸氣劑的方法的引用:

def delete_labels(provider, obj_type, getter): 
    obj_label_list = [] 
    obj_type_list = getter(provider.mgmt) 
    ... 

,然後調用這樣的:delete_labels(provider, obj_type, MgmtClass.list_replication_controller)

在這兩種情況下,你可以移動的三大功能批量(在問題未示出的公共部分)轉換成新的功能,並保持原有的功能更容易使用:

def delete_labels_replication_controller(provider, obj_type): 
    return delete_labels(provider, obj_type, provider.mgmt.list_replication_controller()) 
+0

就個人而言,我會使用第一個變體來減少代碼重複,並將其與第三個變體結合起來,以便在其餘代碼中使用。 –