2017-07-03 40 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

就个人而言,我会使用第一个变体来减少代码重复,并将其与第三个变体结合起来,以便在其余代码中使用。 –