J'ai créé un module contenant une grand nombre de fonctions, pour
traiter chacune un type de données.
Je lance ce module avec en argument un type de données (correspondant au
nom d'une des dites fonctions).
Pour appeler la fonction en question je procède comme suit :
def create_data (key):
"""fonction d'aiguillage vers les fonctions de traitement"""
fonction = globals () [key]
for x in .... :
fonction (x)
Je vais donc chercher la référence à ma fonction dans le dictionnaire
globals().
Par exemple :
create_data ("type_1")
doit appeler la fonction
def type_1 (argument):
...
Cela fonctionne parfaitement, mais j'aurais aimé savoir si c'était le
moyen de procéder le plus "propre" ?
N'y a t-il pas une autre façon sans le dictionnaire globals() ?
etc. Tu pourrais imaginer que le programme lise chaque ligne, examine le premier champ pour savoir de quel type il va avoir besoin, puis appelle une fonction qui se charge des autres champs. Quelque chose du style :
etc. Tu pourrais imaginer que le programme lise chaque ligne, examine le
premier champ pour savoir de quel type il va avoir besoin, puis appelle
une fonction qui se charge des autres champs. Quelque chose du style :
etc. Tu pourrais imaginer que le programme lise chaque ligne, examine le premier champ pour savoir de quel type il va avoir besoin, puis appelle une fonction qui se charge des autres champs. Quelque chose du style :
Je suis très très loin d'être expert en python (mais très près d'être un NooB). Moi ce que j'en pense, c'est que je ne vois pas de cas où j'aurais besoin d'appeler une méthode par son nom.
Si j'ai bien compris, le sport proposé dans ce fil est qu'on a un string et qu'on veut lancer la fonction qui a pour nom ce string.
Donc, juste par curiosité : dans quel cas pratiques est-ce que le problème se pose ?
En fait je dois générer des fichiers d'entêtes contenant les méta-données descriptives de fichiers de données scientifiques.
J'ai un assez grand nombre de type de données (une dizaine) qui peuvent être générés pour plusieurs unités physiques, pour plusieurs satellites, etc...
J'utilise pour créer ces fichiers un système de template (avec string.Template) par type de fichier, et il faut créer un dictionnaire pour remplir les variables du template.
Bref un grand nombre de fichiers différents, avec des cas particuliers dans tous les sens, etc...
Pour cela j'ai créé une fonction par type de fichier, qui embarque toutes les spécificités du type de fichier à générer (pour quel satellite, quelles unités physiques, quels cas particuliers, etc...)
Je veux donc appeler à la demande une de ces fonctions, en passant son nom en paramètre, qui est suffisamment parlant pour nous.
C'est vrai que je peux passer par un menu, mais ça m'oblige juste à rajouter du code pour le gérer, sans apporter grand chose de plus.
Une des richesses de Python est justement de pouvoir faire de l'introspection, d'interroger un module pour connaître les attributs, les fonctions qu'il propose.
Pourquoi donc ne pas utiliser cette possibilité ?
La solution que j'ai utilisée fonctionne parfaitement, je voulais juste savoir s'il n'y avait une méthode plus propre.
Merci quand même pour vos conseils.
Bonne aprème Laurent
moky a écrit :
Qu'en pensez vous ?
Je suis très très loin d'être expert en python (mais très près d'être un
NooB). Moi ce que j'en pense, c'est que je ne vois pas de cas où
j'aurais besoin d'appeler une méthode par son nom.
Si j'ai bien compris, le sport proposé dans ce fil est qu'on a un string
et qu'on veut lancer la fonction qui a pour nom ce string.
Donc, juste par curiosité : dans quel cas pratiques est-ce que le
problème se pose ?
En fait je dois générer des fichiers d'entêtes contenant les
méta-données descriptives de fichiers de données scientifiques.
J'ai un assez grand nombre de type de données (une dizaine) qui peuvent
être générés pour plusieurs unités physiques, pour plusieurs satellites,
etc...
J'utilise pour créer ces fichiers un système de template (avec
string.Template) par type de fichier, et il faut créer un dictionnaire
pour remplir les variables du template.
Bref un grand nombre de fichiers différents, avec des cas particuliers
dans tous les sens, etc...
Pour cela j'ai créé une fonction par type de fichier, qui embarque
toutes les spécificités du type de fichier à générer (pour quel
satellite, quelles unités physiques, quels cas particuliers, etc...)
Je veux donc appeler à la demande une de ces fonctions, en passant son
nom en paramètre, qui est suffisamment parlant pour nous.
C'est vrai que je peux passer par un menu, mais ça m'oblige juste à
rajouter du code pour le gérer, sans apporter grand chose de plus.
Une des richesses de Python est justement de pouvoir faire de
l'introspection, d'interroger un module pour connaître les attributs,
les fonctions qu'il propose.
Pourquoi donc ne pas utiliser cette possibilité ?
La solution que j'ai utilisée fonctionne parfaitement, je voulais juste
savoir s'il n'y avait une méthode plus propre.
Je suis très très loin d'être expert en python (mais très près d'être un NooB). Moi ce que j'en pense, c'est que je ne vois pas de cas où j'aurais besoin d'appeler une méthode par son nom.
Si j'ai bien compris, le sport proposé dans ce fil est qu'on a un string et qu'on veut lancer la fonction qui a pour nom ce string.
Donc, juste par curiosité : dans quel cas pratiques est-ce que le problème se pose ?
En fait je dois générer des fichiers d'entêtes contenant les méta-données descriptives de fichiers de données scientifiques.
J'ai un assez grand nombre de type de données (une dizaine) qui peuvent être générés pour plusieurs unités physiques, pour plusieurs satellites, etc...
J'utilise pour créer ces fichiers un système de template (avec string.Template) par type de fichier, et il faut créer un dictionnaire pour remplir les variables du template.
Bref un grand nombre de fichiers différents, avec des cas particuliers dans tous les sens, etc...
Pour cela j'ai créé une fonction par type de fichier, qui embarque toutes les spécificités du type de fichier à générer (pour quel satellite, quelles unités physiques, quels cas particuliers, etc...)
Je veux donc appeler à la demande une de ces fonctions, en passant son nom en paramètre, qui est suffisamment parlant pour nous.
C'est vrai que je peux passer par un menu, mais ça m'oblige juste à rajouter du code pour le gérer, sans apporter grand chose de plus.
Une des richesses de Python est justement de pouvoir faire de l'introspection, d'interroger un module pour connaître les attributs, les fonctions qu'il propose.
Pourquoi donc ne pas utiliser cette possibilité ?
La solution que j'ai utilisée fonctionne parfaitement, je voulais juste savoir s'il n'y avait une méthode plus propre.
Merci quand même pour vos conseils.
Bonne aprème Laurent
Gael Lickindorf
pour appeler simplement une fonction à partir de son nom, utilisez eval:
def DISQUE(): print 'fonction disque'
if __name__ == '__main__': ligne = "DISQUE 3 5 2" function_name = ligne.split()[0] print function_name eval(function_name)()
on obtient: DISQUE fonction disque
pour appeler simplement une fonction à partir de son nom, utilisez
eval:
def DISQUE():
print 'fonction disque'
if __name__ == '__main__':
ligne = "DISQUE 3 5 2"
function_name = ligne.split()[0]
print function_name
eval(function_name)()
Le eval() on me l'a déjà fortement déconseillé... sur ce forum et ailleurs.
Merci quand même
Bruno Desthuilliers
Francois a écrit :
Alain BARTHE a écrit :
J'ai cherché rapidement dans la doc, mais je n'ai rien trouvé pour l'instant.
Je suis loin d'être un spécialiste, mais je me lance quand même.
En fait, c'est au final la même idée qu'Yves (avec cette astuce du "dictionnaire") mais avec des classes ici. On pourrait remplacer le dictionnaire par un switch, mais il paraît que c'est pas bien.
C'est surtout que c'est impossible - il n'y a pas de 'switch' en Python.
Francois a écrit :
Alain BARTHE a écrit :
J'ai cherché rapidement dans la doc, mais je n'ai rien trouvé pour
l'instant.
Je suis loin d'être un spécialiste, mais je me lance quand même.
En fait, c'est au final la même idée qu'Yves (avec cette astuce du
"dictionnaire") mais avec des classes ici. On pourrait remplacer le
dictionnaire par un switch, mais il paraît que c'est pas bien.
C'est surtout que c'est impossible - il n'y a pas de 'switch' en Python.
J'ai cherché rapidement dans la doc, mais je n'ai rien trouvé pour l'instant.
Je suis loin d'être un spécialiste, mais je me lance quand même.
En fait, c'est au final la même idée qu'Yves (avec cette astuce du "dictionnaire") mais avec des classes ici. On pourrait remplacer le dictionnaire par un switch, mais il paraît que c'est pas bien.
C'est surtout que c'est impossible - il n'y a pas de 'switch' en Python.
Bruno Desthuilliers
moky a écrit :
Qu'en pensez vous ?
Je suis très très loin d'être expert en python (mais très près d'être un NooB). Moi ce que j'en pense, c'est que je ne vois pas de cas où j'aurais besoin d'appeler une méthode par son nom.
C'est pourtant un pattern très courant. Mais bon, comme beaucoup de fonctionalités des langages un peu évolués, on n'en voit pas l'intérêt tant qu'on a pas intégré l'idiome - après, on se demande comment on a pu vivre sans.
Dans la pratique, c'est très utile pour gérer les interactions utilisateurs, entre autres (mais pas uniquement) dans le cadre de programmes en ligne de commande ou d'applications web.
moky a écrit :
Qu'en pensez vous ?
Je suis très très loin d'être expert en python (mais très près d'être un
NooB). Moi ce que j'en pense, c'est que je ne vois pas de cas où
j'aurais besoin d'appeler une méthode par son nom.
C'est pourtant un pattern très courant. Mais bon, comme beaucoup de
fonctionalités des langages un peu évolués, on n'en voit pas l'intérêt
tant qu'on a pas intégré l'idiome - après, on se demande comment on a pu
vivre sans.
Dans la pratique, c'est très utile pour gérer les interactions
utilisateurs, entre autres (mais pas uniquement) dans le cadre de
programmes en ligne de commande ou d'applications web.
Je suis très très loin d'être expert en python (mais très près d'être un NooB). Moi ce que j'en pense, c'est que je ne vois pas de cas où j'aurais besoin d'appeler une méthode par son nom.
C'est pourtant un pattern très courant. Mais bon, comme beaucoup de fonctionalités des langages un peu évolués, on n'en voit pas l'intérêt tant qu'on a pas intégré l'idiome - après, on se demande comment on a pu vivre sans.
Dans la pratique, c'est très utile pour gérer les interactions utilisateurs, entre autres (mais pas uniquement) dans le cadre de programmes en ligne de commande ou d'applications web.
Michel Claveau - NoSpam SVP ; merci
Bonsoir !
Certes, SWITCH n'existe pas. Mais, on peut essayer de le simuler (voir ci-dessous)
J'ai créé un module contenant une grand nombre de fonctions, pour traiter chacune un type de données.
Je lance ce module avec en argument un type de données (correspondant a u nom d'une des dites fonctions).
Lisez le fichier args.py (et commands.py, que vous devrez réécrire pour y mettre vos fonctions) du code source de lamson (http:// lamsonproject.org/). Zed Shaw a déjà écrit le code qui fait ce que vous voulez. Adaptez juste les fichiers à votre cas (à noter que Z.Shaw utilise l'attribut __dict__ du module contenant les fonctions : m.__dict__(func_name)).
On 20 juil, 20:08, Alain BARTHE <alain.barthe...@free.fr> wrote:
Bonjour,
J'ai créé un module contenant une grand nombre de fonctions, pour
traiter chacune un type de données.
Je lance ce module avec en argument un type de données (correspondant a u
nom d'une des dites fonctions).
Lisez le fichier args.py (et commands.py, que vous devrez réécrire
pour y mettre vos fonctions) du code source de lamson (http://
lamsonproject.org/). Zed Shaw a déjà écrit le code qui fait ce que
vous voulez. Adaptez juste les fichiers à votre cas (à noter que
Z.Shaw utilise l'attribut __dict__ du module contenant les fonctions :
m.__dict__(func_name)).
J'ai créé un module contenant une grand nombre de fonctions, pour traiter chacune un type de données.
Je lance ce module avec en argument un type de données (correspondant a u nom d'une des dites fonctions).
Lisez le fichier args.py (et commands.py, que vous devrez réécrire pour y mettre vos fonctions) du code source de lamson (http:// lamsonproject.org/). Zed Shaw a déjà écrit le code qui fait ce que vous voulez. Adaptez juste les fichiers à votre cas (à noter que Z.Shaw utilise l'attribut __dict__ du module contenant les fonctions : m.__dict__(func_name)).
handraiser
On 23 juil, 10:01, Pierre Quentel wrote:
Le seul avantage de gérer explicitement un dictionnaire des fonctions serait d'éviter un possible conflit de noms avec globals(), mais c'est un peu tiré par les cheveux comme argument
On n'a pas besoin de gérer explicitement un dictionnaire. À l'importation d'un module, Python crée lui-même dynamiquement un dictionnaire comprenant les noms définis dans le module.
import blah blah.__dict__
Une solution simple et 'clean' est donc de mettre toutes les fonctions dans un module et de l'importer dans le programme qui les utilise.
On 23 juil, 10:01, Pierre Quentel <quentel.pie...@wanadoo.fr> wrote:
Le seul avantage de
gérer explicitement un dictionnaire des fonctions serait d'éviter un
possible conflit de noms avec globals(), mais c'est un peu tiré par
les cheveux comme argument
On n'a pas besoin de gérer explicitement un dictionnaire. À
l'importation d'un module, Python crée lui-même dynamiquement un
dictionnaire comprenant les noms définis dans le module.
import blah
blah.__dict__
Une solution simple et 'clean' est donc de mettre toutes les fonctions
dans un module et de l'importer dans le programme qui les utilise.
Le seul avantage de gérer explicitement un dictionnaire des fonctions serait d'éviter un possible conflit de noms avec globals(), mais c'est un peu tiré par les cheveux comme argument
On n'a pas besoin de gérer explicitement un dictionnaire. À l'importation d'un module, Python crée lui-même dynamiquement un dictionnaire comprenant les noms définis dans le module.
import blah blah.__dict__
Une solution simple et 'clean' est donc de mettre toutes les fonctions dans un module et de l'importer dans le programme qui les utilise.