Vous avez également getattr
. Voir l'extrait suivant:
>>> import sys
>>> getattr(sys,'exc_info')
<built-in function exc_info>
>>> getattr(sys,'exc_info')()
(None, None, None)
Question
J'ai deux fichiers;
Le premier fichier, myProgram.py
, est un fichier python avec un certain nombre de fonctions
L'une des fonctions contenues à l'intérieur est myFunction
Cette fonction serait appelée avec
import myProgram
myProgram.thisFunction()
myProgram.thatFunction()
Le deuxième fichier contient un système de menu, avec des appels aux fonctions dans myProgram.py
Je voudrais appeler une fonction particulière basée sur un argument transmis à une fonction dans File2
def file2_function(function):
myProgram.function
file2_function(thisFunction(x,y,z))
qui créerait essentiellement MyProgram.
Je suppose que je pourrais le faire en utilisant un tas de déclarations if / elif, disons:
def file2_function(function):
if function == 1:
myProgram.thisFunction
elif function == 2:
myProgram.thatFunction
Bien que cela puisse devenir désordonné car j'utilise déjà beaucoup d'instructions IF / ELIF / ELSE pour le système de menu.
Y a-t-il une meilleure façon (ou la route if / elif est-elle la voie à suivre?)
La solution 4
Vous avez également getattr
. Voir l'extrait suivant:
>>> import sys
>>> getattr(sys,'exc_info')
<built-in function exc_info>
>>> getattr(sys,'exc_info')()
(None, None, None)
Autres conseils
La *args
dans la fonction file2_function
signifie les arguments à transmettre à la fonction dans laquelle il appelle:
def func1(a):
print a
def file2_function(function,*args):
function(*args)
file2_function(func1,4)
#4
Vous pouvez créer un dictionnaire où la clé est le nom de la fonction, et la valeur est la fonction elle-même. Exemple court:
functions = { 'add' : lambda x,y : x + y, 'mult': lambda x,y : x * y, 'div' : lambda x,y : x / y, 'sub' : lambda x,y : x - y }
functions['add'](1,2) # returns 3
@aga vous a donné un bon indice. Lorsque j'écris des applications CLI, je fais habituellement SMTH comme:
def func1():
pass
def func2():
pass
def func3():
pass
def func_caller(name):
func_dict = {
'func1': func1,
'func2': func2,
'func3': func3
}
try:
func_dict[name]()
except KeyError:
print "no such func"