J'essaie d'utiliser un dictionnaire comme instruction switch comme dans

def add(first, second):
    return first + second

def sub():
    ...
    return something

operations = {
    "Add": add,
    "Sub": sub
}

ret_val = operations[operation]

Maintenant, comment puis-je passer les arguments à ajouter et à sous et obtenir leur réponse? Actuellement, je ne passe rien aux méthodes et je teste le ret_val. Ce que je vois, c'est que l'opération est appelée, mais le retour ne revient pas. Ce que j'obtiens est le pointeur sur la méthode d'opération.

Merci!

0
Victor 8 août 2016 à 23:51

3 réponses

Meilleure réponse

Pour appeler une fonction, mettez les arguments entre parenthèses après, comme lorsque vous appelez une fonction directement par son nom.

ret_val = operations[operation](1, 2)

Notez que pour que cela fonctionne correctement, toutes les fonctions de operations doivent prendre le même nombre d'arguments. Donc, cela ne fonctionnera pas si add() prend deux arguments mais sub() n'en prend aucun, comme vous l'avez montré.

Si les fonctions peuvent prendre différents nombres d'arguments, vous pouvez placer les arguments dans une liste et utiliser l'opérateur de décompression.

args = (1, 2)
ret_val = operations[operation](*args)

Il vous suffit ensuite de vous assurer que args contient le nombre approprié d'arguments pour l'opération particulière.

1
Barmar 8 août 2016 à 21:19

Le dictionnaire contient des fonctions appelables. Pour les appeler, ajoutez simplement les arguments entre parenthèses.

operations[operation](arg1, ...)
0
Matt Mahowald 8 août 2016 à 20:55

Donc, la principale chose qui vous manque est d'exécuter l'appel de fonction. Le code fourni saisit correctement la référence de la fonction, mais vous avez besoin de parens pour l'exécuter.

Une fois que vous l'exécutez, vous avez besoin d'un moyen de passer des arguments. Étant donné que le nombre d'arguments varie selon la fonction, le meilleur moyen consiste à transmettre à la fois un nombre variable d'arguments (*args) et un dictionnaire d'arguments de mots clés (**kwargs).

J'ai légèrement rempli votre pseudocode, donc ceux-ci s'exécutent:

def add(first, second):
    return first + second

def sub(first, second):
    return first - second

operations = {
    "Add": add,
    "Sub": sub,
}

Appelez add avec args:

op = 'Add'
op_args = [1, 2]
op_kwargs = {}
ret_val = operations[operation](*op_args, **op_kwargs)
print(ret_val)

3

Appelez ajouter avec kwargs:

op = 'Add'
op_args = []
op_kwargs = {'first': 3, 'second': 4}
ret_val = operations[operation](*op_args, **op_kwargs)
print(ret_val)

sept

Si vous essayez de passer à la fois des arguments et des kwargs de manière conflictuelle, cela échouera:

# WON'T WORK
op = 'Add'
op_args = [1, 2]
op_kwargs = {'first': 3, 'second': 4}
ret_val = operations[operation](*op_args, **op_kwargs)
print(ret_val)

TypeError: add () a obtenu plusieurs valeurs pour l'argument 'first'

Mais vous pouvez utiliser les deux de manière complémentaire:

op = 'Add'
op_args = [1]
op_kwargs = {'second': 4}
ret_val = operations[operation](*op_args, **op_kwargs)
print(ret_val)

5

Une note technique est que le nommage args et kwargs est purement conventionnel en Python. Vous pouvez les appeler comme vous voulez. Une réponse qui traite des deux autres est disponible ici: https://stackoverflow.com/a/36908/149428.

Notez que je n'ai fait aucune validation d'entrée, etc. dans le but d'une réponse simple et ciblée. Si vous recevez des commentaires d'un utilisateur, c'est une étape importante à retenir.

0
Community 23 mai 2017 à 11:51