2017-07-03 4 views
0

Dies ist wahrscheinlich eine sehr Lösung, aber ich habe ein wenig damit zu kämpfen. Ich habe 3 fast ähnliche Funktionen, die ich gerne in einen umgestalten würde.Ersetzen von Namen von Objekten außerhalb des Bereichs in Python

Hier ist die Funktion:

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

Nun, wie Sie sehen, das einzige, was die provider.mgmt.xxx Klasse ändert, und es ändert sich entsprechend der obj_type ich in die Funktion übergeben werden soll. Frage ist, wie man nur 1 Funktion für alle von ihnen benutzt und nur den .xxx Teil des Gegenstandes ersetzt? Danke!

+0

Nicht in der Frage angegeben, aber darf ich davon ausgehen, dass es mehr nach diesen beiden Zeilen kommt? Denn sonst tut keine dieser drei Funktionen überhaupt etwas. –

+0

Ja, da ist mehr. Ich lasse nur, was relevant ist für meine Frage –

Antwort

1

Muss ich bin sicher, dass es eine bessere Lösung ist aber vielleicht getattr wie diese verwenden?

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

wie diese

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

Es ist möglich, aber ich denke, es gibt eine bessere Lösung .. –

+0

__DONT__ "wie dieses", da ist __is__ eine viel bessere Lösung. –

0

Sie könnten nur die obj_type_list als ein anderer Parameter an die Funktion übergeben:

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

und dann wie folgt delete_labels(provider, obj_type, provider.mgmt.list_replication_controller()) nennen (und wenn das die einzige Zeit ist, müssen Sie den provider Parameter, können Sie sie entfernen vollständig)

oder einen Verweis auf die Getter-Methode übergeben:

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

und dann wie folgt aufrufen: delete_labels(provider, obj_type, MgmtClass.list_replication_controller)

In beiden Fällen Sie die Masse der drei Funktionen bewegen kann (der gemeinsame Teil nicht in der Frage gezeigt) in diese neue Funktion und halten die ursprünglichen Funktionen für eine einfachere Nutzung:

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

Persönlich würde ich die erste Variante verwenden, um die Code-Duplizierung zu reduzieren und sie mit der dritten zu kombinieren, um die Verwendung im verbleibenden Code zu vereinfachen. –

Verwandte Themen