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 :

transformer une chaine en nom de fonction


Sujet :

Python

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 57
    Points : 62
    Points
    62
    Par défaut transformer une chaine en nom de fonction
    ayant commencer depuis peu le langage python , j'aimerai savoir si il est possible de concaténer une chaine pour qu'elle puisse entre reconnu comme une fonction valide .
    Source en python 3.1

    ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
    def ScriptStepNum_1(ScriptDateStamp): #Step1
    	# Step1
    	print ('step1')
    
    def ScriptStep_2(ScriptDateStamp):# Step2
    	# Step2
    	print ('step2')
    
    ....
    
    while (ScriptStepNum < ScriptNbStep):
    	ScriptStepNum=+1
    	UDateNow=UniversalDateStamp() #appelle fonction Chrondata
    	StartedTimeScript=UDateNow[0]
    	CallStepArg='\''+StartedTimeScript+'\''
    	CallStep='ScriptStepNum_'+StrScriptStepNum
    	print (CallStep+'('+CallStepArg+')')
    	RetStep=CallStep._call_(CallStepArg)
    	print ('RetStep :'+str(RetStep[0]))
    	print ('RetStep :'+str(RetStep[1]))
    en utilisant le ._Call_ une erreur m'est retourné :

    File "Y:\Script test\ScriptCheckRep\ImportEveQuote.py", line 135, in <module>
    RetStep=CallStep._call_(CallStepArg)
    AttributeError: 'str' object has no attribute '_call_'


    existe il une manière de pouvoir appeler une fonction via son nom en variable ?

  2. #2
    Membre habitué
    Inscrit en
    Mars 2003
    Messages
    127
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2003
    Messages : 127
    Points : 149
    Points
    149
    Par défaut
    Par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    def ScriptStepNum_1(ScriptDateStamp): #Step1
    	# Step1
    	print ('step1')
     
    def ScriptStep_2(ScriptDateStamp):# Step2
    	# Step2
    	print ('step2')
     
    ....
     
    while (ScriptStepNum < ScriptNbStep):
    	ScriptStepNum=+1
    	UDateNow=UniversalDateStamp() #appelle fonction Chrondata
    	StartedTimeScript=UDateNow[0]
    	CallStepArg='\''+StartedTimeScript+'\''
    	CallStep='ScriptStepNum_'+StrScriptStepNum
    	print (CallStep+'('+CallStepArg+')')
    	RetStep= globals()[CallStep](CallStepArg)
    	print ('RetStep :'+str(RetStep[0]))
    	print ('RetStep :'+str(RetStep[1]))

  3. #3
    Membre éprouvé
    Avatar de afranck64
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 592
    Points : 1 006
    Points
    1 006
    Par défaut
    Bonsoir Tyrus,
    Je crois que tu devrais faire appel à la fonction "eval" qui evalue une chaine de caractère passée en paramètre et l'exécute. Voici un petit exemple.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    def surface(a,b):
        return a*b
     
    #calcul de la surface d'un rectangle (3,4)
    larg = 3
    long = 4
     
    cmd = "surface(%s,%s)"%("larg","long")
     
    surf = eval(cmd)
    print surf
    @+ et bon code
    Win 10 64 bits / Linux Mint 18, - AMD A6 Quad: Py27 / Py35
    CONTENU D'UNE QUESTION
    Exemples:
    - Configuration (système d'exploitation, version de Python et des bibliothèques utilisées)
    - Code source du morceau de programme où il y a un bogue
    - Ligne de code sur laquelle le bogue apparaît
    - Erreur complète retournée pas l'interpréteur Python
    - Recherche déjà effectuée (FAQ, Tutoriels, ...)
    - Tests déjà effectués

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 57
    Points : 62
    Points
    62
    Par défaut
    merci à vous deux , en épluchant les sites et mes livres de ref oreilly j'avais rien trouvé ...

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    eval est quand même un peu "lourd" dans ce cas.
    N'oubliez pas que les 'variables' sont dans le "globals" du module qui est un dict <=> variable == globals()['variable']
    D'où:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    def surface(a,b):
        return a*b
     
    #calcul de la surface d'un rectangle (3,4)
    larg = 3
    long = 4
     
    surf = globals()['surface'](larg, globals()['long'])
    print surf
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre éprouvé
    Avatar de afranck64
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 592
    Points : 1 006
    Points
    1 006
    Par défaut
    merci Wiztricks, j'ai pris la mauvaise habitude de me faire violence avec "eval" à tout bout de champ.
    Win 10 64 bits / Linux Mint 18, - AMD A6 Quad: Py27 / Py35
    CONTENU D'UNE QUESTION
    Exemples:
    - Configuration (système d'exploitation, version de Python et des bibliothèques utilisées)
    - Code source du morceau de programme où il y a un bogue
    - Ligne de code sur laquelle le bogue apparaît
    - Erreur complète retournée pas l'interpréteur Python
    - Recherche déjà effectuée (FAQ, Tutoriels, ...)
    - Tests déjà effectués

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par afranck64 Voir le message
    merci Wiztricks, j'ai pris la mauvaise habitude de me faire violence avec "eval" à tout bout de champ.
    De rien.
    Quand on est pressé et la tête ailleurs, "eval" rend bien service... mais il ne faut quand même pas oublier les bases.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    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 752
    Points
    1 752
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    De rien.
    Quand on est pressé et la tête ailleurs, "eval" rend bien service... mais il ne faut quand même pas oublier les bases.
    Mais il ne faut pas oublier que eval est potentiellement dangereux.

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par rambc Voir le message
    Mais il ne faut pas oublier que eval est potentiellement dangereux.
    Ouais mais tant qu'on ne démarre pas le PeeCee, on est tranquille
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  10. #10
    Membre éprouvé
    Avatar de afranck64
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 592
    Points : 1 006
    Points
    1 006
    Par défaut
    Bonsoir,
    excuse moi rambc mais je ne comprend pas lorsque tu dis que eval est potentiellement dangereux.
    Win 10 64 bits / Linux Mint 18, - AMD A6 Quad: Py27 / Py35
    CONTENU D'UNE QUESTION
    Exemples:
    - Configuration (système d'exploitation, version de Python et des bibliothèques utilisées)
    - Code source du morceau de programme où il y a un bogue
    - Ligne de code sur laquelle le bogue apparaît
    - Erreur complète retournée pas l'interpréteur Python
    - Recherche déjà effectuée (FAQ, Tutoriels, ...)
    - Tests déjà effectués

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par afranck64 Voir le message
    Bonsoir,
    excuse moi rambc mais je ne comprend pas lorsque tu dis que eval est potentiellement dangereux.
    ben tant qu'on ne fait pas un eval de ce que retourne, par exemple, raw_input ou de chaines de caractères récupérées à "l'extérieur" sans avoir testé qu'elles sont dans un domaine de valeurs "raisonnables", c'est la porte ouverte à s'attraper des 'virus par injection de code'.

    Mais bon, si on est "trop" parano mieux vaut ne pas booter
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 57
    Points : 62
    Points
    62
    Par défaut
    là le core du script est constitué d'un boucle qui lance des fonctions en chaine et qui loggera chaque actions de chaques fonctions dans des fichier de log externe

    donc par economie je voulais faire tenir cela dans une boucle while

    je fait un squelette générique pour tous mes scripts , le but étant d'obtenir une normalisation des scripts
    -découpage en step ( pour facilité le débogage et ou les actions corrective fournis dans le cadre de consigne de pilotage => ceux qui suit la vie d'un script après son Dev= la mise en exploitation )

    l'entrée de donnée externe se fait par fichier xml ( pour la configuration global de certaine variable de localisation)

    le risque d'import de code malicieux reste "faible"

  13. #13
    Membre éprouvé
    Avatar de afranck64
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 592
    Points : 1 006
    Points
    1 006
    Par défaut
    Bonjour,

    excuse moi mais la tu me perds un peu.
    Win 10 64 bits / Linux Mint 18, - AMD A6 Quad: Py27 / Py35
    CONTENU D'UNE QUESTION
    Exemples:
    - Configuration (système d'exploitation, version de Python et des bibliothèques utilisées)
    - Code source du morceau de programme où il y a un bogue
    - Ligne de code sur laquelle le bogue apparaît
    - Erreur complète retournée pas l'interpréteur Python
    - Recherche déjà effectuée (FAQ, Tutoriels, ...)
    - Tests déjà effectués

  14. #14
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 76
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Points : 1 913
    Points
    1 913
    Par défaut
    Il me semble que l'usage donné par moons17 est une 'trace'.
    Peut-être vaut-il mieux pour ce cas utiliser un décorateur, voir par exemple:
    http://wordaligned.org/articles/echo
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 57
    Points : 62
    Points
    62
    Par défaut
    en fait c'est pour une generation de 2 types de fichier de log distinct
    l'un détaillé réservé au dev
    l'autre destiné à un outil ( que je met au point ) de supervision et centralisation de résultat log ( destiné à la production )

    cela évite de passer des heures à trouver une erreur d'exécution de script dans moult fichiers de log pour des application multiserveur

    mais bon le script que je fait n'est juste qu'un exemple qui me servira à finir le dev de l'outil

    j'aurai une question subsidiaire concernant les variables :

    peut-on procéder de la même manière , c'est à dire :

    je récupère aussi dans des paramètres de balise xml des noms de variable et les déclare depuis une chaine ou élément de node

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    globals() [XmlVarNameImport['value']]=XmlVarValueImport
    XmlVarNameImport['value'] contient le nom de la variable
    XmlVarValueImport contient l'affectation à associé

    ça marche aussi après quelques essai de mauvaise imbrication

  16. #16
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par moons17 Voir le message
    en fait c'est pour une generation de 2 types de fichier de log distinct
    l'un détaillé réservé au dev
    l'autre destiné à un outil ( que je met au point ) de supervision et centralisation de résultat log ( destiné à la production )
    Une bibliothèque sous utilisée et qui mache bien le boulot pour faire çà est logging: on filtre les erreurs qu'on envoit dans les différents fichiers de log ou via smtp mail ou ...

    je récupère aussi dans des paramètres de balise xml des noms de variable et les déclare depuis une chaine ou élément de node
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    globals() [XmlVarNameImport['value']]=XmlVarValueImport
    Oui on peut!! Mais j'espère que les noms et valeurs importés ont été "validés" avant qu'on les insère dans globals().
    En fait j'aime pas du tout
    Je ne vois pas ce que coûte la création d'une classe ou d'un dict contenant attributs et valeurs "importées" depuis les fichiers XML genre xml_config.
    En mettant les variables directement dans "globals", je perds:
    • en traçabilité: en lisant la fonction foo, si on voit qu'elle dépend du contenu de la variable toto, c'est moins parlant que xml_config['toto'],
    • en découplage: une fois le dict/class xml_config construit on peut lui mettre toutes les valeurs qu'on veut et tester le code. La lecture du XML et son format est un autre problème. On peut mettre 'à l'avance' des paramètres dont on ne tient pas compte et/ou prendre en compte des paramètre non documentés - si çà ne marche pas encore bien partout.


    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Réponses: 10
    Dernier message: 10/02/2010, 08h49
  2. [Débutant] Transformation d'une chaine de caractères en fonction
    Par safizounet dans le forum Interfaces Graphiques
    Réponses: 4
    Dernier message: 27/01/2009, 17h08
  3. Réponses: 1
    Dernier message: 13/06/2007, 13h14
  4. fonction qui transforme une chaine en majuscule
    Par kawther dans le forum Langage
    Réponses: 3
    Dernier message: 23/04/2007, 11h47
  5. Réponses: 14
    Dernier message: 01/03/2006, 08h32

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