Tengo una situación en la que tengo seis situaciones posibles que pueden relacionarse con cuatro resultados diferentes. En lugar de usar una instrucción if/else extendida, me preguntaba si sería más pitónico usar un diccionario para llamar a las funciones que llamaría dentro del if/else como reemplazo de una instrucción "switch", como una que podría usarse en C# o php.¿Es este un método "pythonic" de ejecución de funciones como una declaración de cambio de pitón para valores de tupla?
Mi declaración de cambio depende de dos valores que estoy usando para construir una tupla, que a su vez utilizaré como la clave del diccionario que funcionará como mi "interruptor". Obtendré los valores para la tupla de otras dos funciones (llamadas a bases de datos), por lo que tengo las funciones de ejemplo one() y zero().
Este es el patrón de código que estoy pensando en usar la que me topé con jugar en la cáscara de pitón:
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]()
que no tienen el código real o escrito que iba a publicar aquí, como Me gustaría saber si este método se considera una mejor práctica de Python. Todavía soy un aprendiz de pitón en la universidad, y si este es un método que es un mal hábito, me gustaría patearlo ahora antes de salir al mundo real.
Nota: el resultado de ejecutar el código anterior es el esperado, simplemente "RUN" y "WALK".
edición
Para aquellos de ustedes que están interesados, así es como el código en cuestión resultó. Se está utilizando en una aplicación de motor de aplicación de Google. Debería encontrar que el código es considerablemente más ordenado que mi patrón de ejemplo aproximado. Funciona mucho mejor que mi anterior árbol intrincado 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]()
Mucho mejor! Muy legible y 'Pythonic' – dawg
Tenga en cuenta que 'Switch [(x, y)]' puede escribirse más limpiamente como 'Switch [x, y]' – Eric