62 votes

J'ai une chaîne dont le contenu est un nom de fonction, comment faire référence à la fonction correspondante en Python ?

Par exemple, si j'ai une fonction appelée add comme

 def add(x,y):
    return x+y

et je veux la possibilité de convertir une chaîne ou une entrée pour diriger vers cette fonction comme

 w=raw_input('Please input the function you want to use')

ou

 w='add'

Existe-t-il un moyen d'utiliser w pour faire référence à la fonction add ?

21voto

Chris Morgan Points 22285

Un moyen sûr consiste à mapper des noms aux fonctions. C'est plus sûr que d'utiliser eval .

 function_mappings = {
        'add': add,
}

def select_function():
    while True:
        try:
            return function_mappings[raw_input('Please input the function you want to use')]
        except KeyError:
            print 'Invalid function, try again.'

17voto

Oscar Korz Points 1642

La fonction intégrée eval fera ce que vous voulez. Tous les avertissements habituels concernant l'exécution de code arbitraire fourni par l'utilisateur s'appliquent.

S'il existe un nombre fini de fonctions prédéfinies, vous devez éviter eval et utiliser une table de recherche à la place (c'est-à-dire Dict ). Ne faites jamais confiance à vos utilisateurs.

15voto

Foo Bah Points 11566

La solution d'unutbu est ce que j'utiliserais normalement, mais par souci d'exhaustivité :

Si vous spécifiez le nom exact de la fonction, vous pouvez utiliser eval , bien que cela soit fortement déconseillé car les gens peuvent faire des choses malveillantes :

 eval("add")(x,y)

14voto

Jefferson Felix Points 121

Utilisez simplement la référence de fonction :

 def pwr(x, y):
    return x ** y

def add(x, y):
    return x + y

dispatcher = { 'pwr' : pwr, 'add' : add}

def call_func(x, y, func):
    try:
        return dispatcher[func](x, y)
    except:
        return "Invalid function"

call_func(2, 3, 'add')

Simple et sécurisé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X