这可能是一个非常有效的解决方案,但我正在努力解决这个问题。 我有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部分? 谢谢!
答案 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())