2017-03-01 6 views
0

Ich habe eine Funktion mit einem Argument, und innerhalb der Funktion gibt es innere Funktionen mit möglichen Argumente, die an die äußere Funktion übergeben werden können.Aufruf innere Funktion basierend auf dem Argument übergeben äußere Funktion

def delete_alphabet(del_apha): 
    def del_a(): 
     # code to delete a 
    def del_b(): 
     # code to delete b 
    def del_c(): 
     # code to delete c 
    def del_d(): 
     # code to delete d 

Ich möchte del_b() Funktionen aufzurufen, del_c(), del_d() wenn ich a zu delete_alphabet(a) passieren, Anruffunktionen del_a(), del_c(), del_d() wenn ich pass b zu delete_alphabet(b), Anruffunktionen del_a(), del_b(), del_d() wenn Ich übergebe c an delete_alphabet(c), Anruffunktionen del_a(), del_b(), del_c() wenn ich pass d zu delete_alphabet(d)

Kann jemand vorschlagen, mir einen Weg, dies zu lösen?

+0

Was ist 'b'? Was ist "ein"? Was meinst du mit "löschen"? Hoffentlich nicht "del" ... Aber warum sind diese Funktionen in einem Verschluss überhaupt? Könnten sie nicht außerhalb definiert werden? mehr Details, bitte –

+0

'a' und' b' können eine beliebige Zeichenfolge sein, die ich aus einer Datei löschen möchte. Nicht "del". –

+0

Warum nicht 'delete_string (x)' wo 'x' kann' a' oder 'b' sein? –

Antwort

0

In Python sind Funktionen nur Objekte. Ihr Ansatz kann dies so einfach sein:

In [22]: def del_a(): print('deleting a') 

In [23]: def del_b(): print('deleting b') 

In [24]: def del_c(): print('deleting c') 

In [25]: def del_d(): print('deleting d') 

In [26]: funcs = {'a':(del_a, del_c, del_d), 'b': (del_a, del_b, del_d)} 

In [27]: def delete_alphabet(del_alpha, funcs=funcs): 
    ...:  for f in funcs[del_alpha]: 
    ...:   f() 
    ...: 

In [28]: delete_alphabet('a') 
deleting a 
deleting c 
deleting d 

In [29]: delete_alphabet('b') 
deleting a 
deleting b 
deleting d 

EDIT Also, angesichts der Erläuterungen in den Kommentaren, mein Ansatz wäre die folgende:

In [30]: funcs = [('a', del_a), ('b', del_b), ('c', del_c), ('d', del_d)] 

In [31]: def delete_alphabet(del_alpha, funcs=funcs): 
    ...:  for c, f in funcs: 
    ...:   if c != del_alpha: 
    ...:    f() 
    ...: 

In [32]: delete_alphabet('a') 
deleting b 
deleting c 
deleting d 

In [33]: delete_alphabet('b') 
deleting a 
deleting c 
deleting d 

In [34]: delete_alphabet('c') 
deleting a 
deleting b 
deleting d 

In [35]: delete_alphabet('d') 
deleting a 
deleting b 
deleting c 

Es ist viel sauberer einige zu halten Art der Zuordnung von String zu Funktion, anstatt einige eval Hack zu verwenden.

+0

Wenn ich mehr als 20 gültige Argumente übergeben muss, erhöht sich die Anzahl der Zeilen im Code, was nicht gut aussieht. Daher muss ein alternativer Ansatz gewählt werden, um die Wiederholung von aufrufenden Funktionen zu vermeiden. 'funcs = {'a' :(del_a, del_c, del_d), 'b': (del_a, del_b, del_d)} Dies muss ich für alle 20+ Argumente schreiben. –

+0

@Sweety Nun, wie könnte es einen anderen Weg als das Aufzählen geben, welche Funktionen Sie bei Ihrem Argument aufrufen wollen? Python kann Ihre Gedanken nicht lesen ... Gibt es eine Möglichkeit, dass "a" sich auf die Funktionen bezieht, die Sie programmatisch erhalten könnten? Wenn ja, haben Sie das in Ihrer Frage nicht angegeben. –

+0

@Sweety AH. Ich sehe was du jetzt willst. Ich wusste nicht, dass "del_a" nicht für "a" gerufen wurde. Ich sehe das Muster ... –

Verwandte Themen