在Python中替换范围之外的对象名称

时间:2017-07-03 14:21:31

标签: python

这可能是一个非常有效的解决方案,但我正在努力解决这个问题。 我有3个几乎相似的函数,我想重构成一个。

这是功能:

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部分? 谢谢!

3 个答案:

答案 0 :(得分:1)

我确信有一个更好的解决方案,但可能会像这样使用getattr

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

答案 1 :(得分:0)

这样做

waitpids() { 
  local pids_status
  for pid in "$@"; do
    wait "$pid";
    pids_status+=($?)
  done
  echo "$pids_status[@]}"
}

答案 2 :(得分: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参数的唯一时间,则可以完全删除它)

或者传递对getter方法的引用:

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())