IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Problème pour définir un dictionnaire de fonctions


Sujet :

Python

  1. #1
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 751
    Points
    1 751
    Par défaut Problème pour définir un dictionnaire de fonctions
    Bonujour,
    je veux créer un dictionnaire dont les valeurs sont des fonctions.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dico_fc={}
    dico_fc['NBRE']=lit_NBRE
    dico_fc['PLUS']=lit_PLUS
    Je voudrais savoir s'il y a un moyen de définir le dictionnaire avec une syntaxe du type 'lit_' + 'NBRE' et 'lit_' + 'PLUS' à la place de lit_NBRE et lit_PLUS. En fait, je cherche à désigner les noms des fonctions en utilisant une chaîne de caractères.

    L'idée serait ainsi de définir différents dictionnaires de fonctions avec seulement le préfixe qui change.

    Tout aide ou indication est la bienvenue.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Points : 1 384
    Points
    1 384
    Par défaut
    Il y en a plusieurs; le plus moche serait d'utiliser eval:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> def lit_NBRE():
    ... 	pass
    ... 
    >>> eval('lit_NBRE')
    <function lit_NBRE at 0x00D94D70>
    Ou alors globals mais c'est pas beaucoup mieux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> globals()['lit_NBRE']
    <function lit_NBRE at 0x00D94D70>
    Si tu mets toutes tes fonctions dans un module et/ou comme méthodes dans une classe, tu peux utiliser getattr; c'est le plus propre sans doute:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> import os
    >>> getattr(os, 'walk')
    <function walk at 0x00A0B570>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    >>> class Lecteur(object):
    ... 	@staticmethod
    ... 	def lit_NBRE():
    ... 		pass
    ... 	
    >>> getattr(Lecteur, 'lit_NBRE')
    <function lit_NBRE at 0x00D9FB30>

  3. #3
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 751
    Points
    1 751
    Par défaut
    Merci ! getattr fonctionne très bien.

    Pourquoi dis-tu que l'emploi de eval ou globals() est moche ? Le seul inconvénient est qu'on ne sait pas trop où on cherche la fonction. Mis à part cela, existe-t-il une différence avec l'emploi de getattr ?

  4. #4
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Points : 1 384
    Points
    1 384
    Par défaut
    Déjà, eval c'est relativement lourd, vu que ça permet d'évaluer une expression python quelconque. Ensuite, si ne fusse qu'une partie de la chaîne évaluée provient, même de façon détournée, d'une entrée de l'utilisateur, cela pourrait permet l'exécution de code arbitraire et constitue donc une faille de sécurité.

    Avec globals() tu accèdes au namespace global, qui est pollué par toutes les définitions globales dans le programme. De plus, ça t'oblige à définir les fonctions dont tu as besoin au niveau global, ce n'est pas extrêmement modulaire.

    L'utilisation de getattr traduit aussi mieux l'intention du programmeur à mon avis. En lisant le code, il est plus facile de se rendre compte de ce que fait getattr que globals ou eval, et d'être convaincu que ce code ne fait rien de plus que ce qu'il semble.

  5. #5
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 751
    Points
    1 751
    Par défaut
    OK et vraiment merci pour ces éclaircissements.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 03/03/2008, 15h29
  2. Problème pour définir une valeur dans la base des registres
    Par hellspawn_ludo dans le forum Dreamshield
    Réponses: 2
    Dernier message: 30/09/2007, 03h03
  3. Réponses: 2
    Dernier message: 25/06/2007, 11h38
  4. Problème pour définir un web service client
    Par GRicco dans le forum NetBeans
    Réponses: 5
    Dernier message: 10/04/2007, 09h54
  5. Problème pour la création d'une fonction
    Par jipé95 dans le forum C
    Réponses: 5
    Dernier message: 10/12/2006, 14h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo