2017-10-09 4 views
1

J'ai déjà un travail, mais dans mon oppinion pas belle solution pour une partie d'un script long.Python moyen d'appeler méthode en fonction de la variable [solution: dictionnaires]

Mon script utilise plusieurs méthodes similaires, qui diffèrent trop pour être combinées. Cependant je suis arrivé à un point où je veux appeler l'une de ces méthodes en fonction d'une variable donnée.

Les noms des méthodes sont construites comme ceci:

def read_A(): 
    #doing sth 
def read_B(): 
    #doing sth else 
def read_C(): 

etc.

Maintenant, je voudrais appeler ces méthodes de manière pythonique, lorsque la lettre (A, B, C, ...) est donnée en tant que variable.

La solution non pythonique serait:

if var == "A": 
    read_A() 
if var == "B": 
    read_B() ..... 

Et j'espère trouver une solution plus pythonique qui me permet d'appeler ces méthodes simplement comme ceci:

var = "A" 
read_var()  #This would call the method 'read_A()' 

S'il vous plaît l'esprit que le code ci-dessus n'est qu'une image de ce que j'espère faire, ce n'est pas un exemple de travail!

J'espère avoir clairement indiqué mon problème, merci d'avance!

+1

Créez un dictionnaire avec les lettres comme clés et les méthodes comme valeurs. –

Répondre

2

Je ne vois pas un problème avec juste en utilisant

if var == 'A': 
    read_a() 

mais si vous souhaitez le rendre plus « pythonique » vous pouvez mapper vos variables aux méthodes en utilisant un dictionnaire et l'exécuter en fonction du résultat de ce qui est stocké dans votre dictionnaire:

def read_a(): 
    print('Running method read_a') 

def read_b(): 
    print('Running method read_b') 

switch = {'A': read_a, 'B': read_b} 

case = 'A' 
switch.get(case)() 
>> 'Running method read_a' 
case = 'B' 
switch.get(case)() 
>> 'Running method read_b' 
+0

Le code fonctionne en effet en utilisant si, mais il faut beaucoup et je voudrais savoir s'il y a un moyen de le raccourcir d'une manière élégante – yfro

+0

Espérons que cela soit assez élégant, il devrait réduire vos lignes de code si vous avoir beaucoup de déclarations si – AK47

1

Collez les fonctions dans un dictionnaire, et utiliser le dictionnaire pour envoyer à l'élu:

read = {'A': read_a, 'B': read_b, 'C': read_c} 
choice = 'A' 
read[choice]() 

Sur cette dernière ligne, vous recherchez la fonction qui correspond à votre choix dans le dictionnaire, puis vous l'appelez immédiatement.

1

Vous pouvez le faire de cette manière si vous avez plusieurs fonctions nommées read_a, read_b ... etc, au lieu d'écrire un énorme dictionnaire.

def read_a(): 
    print('Running method read_a') 

def read_b(): 
    print('Running method read_b') 

def read_c(): 
    print("running method read_c") 

def read_d(): 
    print("running method read_d") 

............ 
............ 

def read_z(): 
    print("running method read_z") 

def _read_var(var): 
    method = "read_{}".format(var.lower()) 
    try: 
     eval(method)() 
    except NameError: 
     raise NotImplementedError 

var = "A" 
_read_var(var)# will invoke read_a method 
+1

semble intéressant. Je vais essayer. THX! – yfro

1

vous pouvez utiliser la construction suivante:

def execute_func(x): 
    return { 
     '0':read_A(), 
     '1':read_B() 
    }[x] 

Définir vos variables au lieu '0' et '1' ou plus et passer vos params à execute_func().

+1

Cela exécute à la fois read_A et read_B et il retourne juste la solution de celui sélectionné, vous devez enlever la parenthèse du dict et les placer après le '} [x]' – Adirio

+0

Je l'ai essayé et était curieux de savoir pourquoi il le fait. Cela aide vraiment – yfro