Mam sytuację, w której mam sześć możliwych sytuacji, które mogą odnosić się do czterech różnych wyników. Zamiast używać rozszerzonej instrukcji if/else, zastanawiałem się, czy byłoby bardziej pythonic używać słownika do wywoływania funkcji, które nazwałbym wewnątrz instrukcji if/else jako zamiennika dla instrukcji "switch", jak można by użyć w języku C# lub php.Czy jest to "pythonic" metoda wykonywania funkcji jako instrukcja przełączania Pythona dla wartości krotki?
Moja instrukcja switch zależy od dwóch wartości, których używam do zbudowania krotki, którą z kolei użyję jako klucz do słownika, który będzie funkcjonował jako mój "przełącznik". Będę pobierał wartości dla krotki z dwóch innych funkcji (wywołania bazy danych), dlatego mam przykład funkcji jeden() i zero().
Jest to wzór kod mam na myśli używając który natknąłem się na z zabawy w łupinach Pythona:
def one():
#Simulated database value
return 1
def zero():
return 0
def run():
#Shows the correct function ran
print "RUN"
return 1
def walk():
print "WALK"
return 1
def main():
switch_dictionary = {}
#These are the values that I will want to use to decide
#which functions to use
switch_dictionary[(0,0)] = run
switch_dictionary[(1,1)] = walk
#These are the tuples that I will build from the database
zero_tuple = (zero(), zero())
one_tuple = (one(), one())
#These actually run the functions. In practice I will simply
#have the one tuple which is dependent on the database information
#to run the function that I defined before
switch_dictionary[zero_tuple]()
switch_dictionary[one_tuple]()
nie mam rzeczywisty kod napisany albo będę po to tutaj, jako Chciałbym wiedzieć, czy ta metoda jest uważana za najlepszą praktykę Pythona. Nadal jestem uczniem Pythona na uniwersytecie i jeśli jest to metoda, która jest złym nawykiem, to chciałbym ją teraz wyrzucić, zanim wyjdę na prawdziwy świat.
Uwaga, wynik wykonania powyższego kodu jest zgodny z oczekiwaniami, po prostu "RUN" i "WALK".
edit
Dla tych z Was, którzy są zainteresowani, to w jaki sposób odpowiedni kod okazało. Jest używany w aplikacji do obsługi aplikacji Google. Powinieneś odkryć, że kod jest znacznie bardziej uporządkowany niż mój przykładowy wzór. Działa znacznie lepiej niż moje wcześniejsze zawiłe drzewo if/else.
def GetAssignedAgent(self):
tPaypal = PaypalOrder() #Parent class for this function
tAgents = []
Switch = {}
#These are the different methods for the actions to take
Switch[(0,0)] = tPaypal.AssignNoAgent
Switch[(0,1)] = tPaypal.UseBackupAgents
Switch[(0,2)] = tPaypal.UseBackupAgents
Switch[(1,0)] = tPaypal.UseFullAgents
Switch[(1,1)] = tPaypal.UseFullAndBackupAgents
Switch[(1,2)] = tPaypal.UseFullAndBackupAgents
Switch[(2,0)] = tPaypal.UseFullAgents
Switch[(2,1)] = tPaypal.UseFullAgents
Switch[(2,2)] = tPaypal.UseFullAgents
#I'm only interested in the number up to 2, which is why
#I can consider the Switch dictionary to be all options available.
#The "state" is the current status of the customer agent system
tCurrentState = (tPaypal.GetNumberofAvailableAgents(),
tPaypal.GetNumberofBackupAgents())
tAgents = Switch[tCurrentState]()
Znacznie lepiej! Bardzo czytelny i "Pythoniczny" – dawg
Zauważ, że 'Przełącz [(x, y)]' może być napisany bardziej czysto jako 'Przełącz [x, y]' – Eric