2017-10-24 1 views
4

Ich versuche, eine Switch-Logik in Python zu bauen.Pythonic Schalter innerhalb der Klasse

Basierend auf Replacements for switch statement in Python? ich den folgenden Code bauen:

def func(string): 
    print(string) 

class Switch: 
    def __init__(self): 
     pass 

    def first_switch(self, case): 
     return { 
      '1': func('I am case 1'), 
      '2': func('I am case 2'), 
      '3': func('I am case 3'), 
      }.get(case, func('default')) 


switch = Switch() 
switch.first_switch('2') 

Das gibt mir die Ausgabe:

I am case 1 
I am case 2 
I am case 3 
default 

ich die Ausgabe

I am case 2 

Ist das Wörterbuch zu erwarten -case-logic nur außerhalb einer Klassendefinition anwendbar oder habe ich etwas zusätzlichen Code vermisst? Es sieht so aus, als ob alle Schlüssel/Wert-Paare aus dem Wörterbuch beim Funktionsaufruf ausgewertet werden.

+0

Der Wert ist das * Ergebnis * die Funktion aufrufen. Warum speichern Sie nicht einfach die Zeichenfolgen und rufen 'func' auf, was auch immer Sie aus dem Wörterbuch herausholen? Warum sollte man sich auch mit 'func' beschäftigen, wenn es nur' print' ist? – jonrsharpe

+0

Wenn Sie Werte speichern möchten, sollte func sein Argument zurückgeben. Gerade jetzt ist dein Wörterbuch alles Nones. –

Antwort

7

Sie rufen beim Erstellen des Wörterbuchs immer alle diese Funktionen auf. Es hat nichts mit Klassen zu tun.

d = {'foo': bar()} 

bar wird hier und ihr Rückgabewert zu d['foo'] zugewiesen genannt. Denken Sie daran, dies ist keine switch Aussage; Es ist ein Wörterbuch-Literal, das verwendet wird, um eine switch-Anweisung zu emulieren.

In Ihrem Fall ist die Funktion nicht variabel, so haupt nicht enthalten sein muss:

arg = { 
    '1': 'I am case 1', 
    '2': 'I am case 2', 
    '3': 'I am case 3', 
}.get(case, 'default') 
func(arg) 

Wenn die Funktion, sondern auch variabel ist, können Sie die Wörterbuchwerte Callables machen wollen die rufen die Funktion, wenn genannt:

{'1': lambda: func('I am case 1'), ...}.get(...)() 
        # call the function you got ^^ 

Oder vielleicht:

from functools import partial 

{'1': partial(func, 'I am case 1'), ...}.get(...)() 
+0

Sorry für das unpassende Beispiel, die Funktion, die ich aufrufen möchte, ist in der Tat variabel und somit ist dein 'Lambda'-Ausdruck der Schlüssel! Danke für Ihre Erklärung! – heiiRa

0

Andere Lösung:

def func(string): 
    print(string) 

class Switch: 
    def __init__(self): 
     pass 

    def first_switch(self, case): 
     param = { 
      '1': (func, 'I am case 1'), 
      '2': (func, 'I am case 2'), 
      '3': (func, 'I am case 3'), 
      }.get(case, (func, 'default')) 
     return param[0](*param[1:]) 

switch = Switch() 
switch.first_switch('2') 
+0

Sicher 'param [0] (* param [1:])' würde auch tun ...? – deceze

+0

danke, fest –

+0

Nein, ich meine, Sie brauchen überhaupt nicht '' func_wrapper''. – deceze

Verwandte Themen