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 :

passage d'une liste à une fonction avec exec()


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Inscrit en
    Février 2007
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 30
    Points : 28
    Points
    28
    Par défaut passage d'une liste à une fonction avec exec()
    Bonjour,
    Je souhaite envoyer une liste comme argument à une fonction (jusque là tout va bien) mais le problème est que je dois appeler la fonction par exec(....).
    Dans ce cas evidement, il y a confusion des genres entre la liste et exec qui ne souhaite que des str pour construire mon appel.

    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
     
    def param1_decode(mylistoflist=[]):
        mylistoflist[0][1] = mylistoflist[0][1].upper
        return mylistoflist[0][1]
     
    mylistoflist = [[32, 'service_type', '00', 'Default'], [34, 'source_addr_ton', '0x00', 'Unknown']]
    myparamlist = [("param1",6,"coctetstring"),("param2",1,"integer"),("param3",1,"integer")]
     
    for x in range(len(myparamlist)):
        myparam_decode = ""
        myparam_name = myparamlist[x][0]
        myparam_length = myparamlist[x][1]
        myparam_type = myparamlist[x][2]
        exec("myparam_decode = " + myparam_name + "_decode('" + mylistoflist + "')")
        print myparam_decode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        exec("myparam_decode = " + myparam_name + "_decode('" + mylistoflist + "')")
    TypeError: cannot concatenate 'str' and 'list' objects
    J'ai essayé avec l'utilisation de la liste en variable globale, celà fonctionne sauf dans un code mod_python (avec formulaires, ...) où les variables globales restent inutilisables.

    Merci par avance pour votre aide.

  2. #2
    Membre émérite
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Points : 2 533
    Points
    2 533
    Par défaut
    En changeant juste la ligne en gras :

    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
    23
    24
    25
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    
    def param1_decode(mylistoflist=[]):
        mylistoflist[0][1] = mylistoflist[0][1].upper()
        return mylistoflist[0][1]
     
    def param2_decode(mylistoflist=[]):
        mylistoflist[0][1] = mylistoflist[0][1].upper()
        return mylistoflist[0][1]
    
    def param3_decode(mylistoflist=[]):
        mylistoflist[0][1] = mylistoflist[0][1].upper()
        return mylistoflist[0][1]
    
    mylistoflist = [[32, 'service_type', '00', 'Default'], [34, 'source_addr_ton', '0x00', 'Unknown']]
    myparamlist = [("param1",6,"coctetstring"),("param2",1,"integer"),("param3",1,"integer")]
     
    for x in range(len(myparamlist)):
        myparam_decode = ""
        myparam_name = myparamlist[x][0]
        myparam_length = myparamlist[x][1]
        myparam_type = myparamlist[x][2]
        exec "myparam_decode = " + myparam_name + "_decode(" + repr(mylistoflist) + ")"
        print myparam_decode
    Si ce message vous a semblé utile, il est possible qu'il soit utile à d'autres personnes. Pensez au . Et n'oubliez pas le le moment venu !

    On n'a pas à choisir si l'on est pour ou contre la décroissance, elle est inéluctable, elle arrivera qu'on le veuille ou non.

  3. #3
    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
    Ceci doit fonctionner:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exec("myparam_decode = " + myparam_name + "_decode(" + str(mylistoflist) + ")")
    Mais c'est pas très propre d'utiliser exec pour ça.
    Un peu mieux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myparam_decode = locals()[myparam_name + "_decode"](mylistoflist)
    Mais j'aurais sans doute fait une classe Decoder avec toutes les fonctions *_decode comme méthodes, et ensuite utilisé getattr pour retrouver la bonne méthode. Ou un dictionnaire avec comme clés le nom des paramètres et comme valeurs les fonctions de decodage.

    [edit] DelphiManiac a été plus rapide [/edit]

  4. #4
    Nouveau membre du Club
    Inscrit en
    Février 2007
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 30
    Points : 28
    Points
    28
    Par défaut
    Un grand merci.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 31/07/2013, 05h13
  2. Tri d'une liste d'attente avec priorité
    Par boutchz dans le forum Access
    Réponses: 8
    Dernier message: 02/03/2006, 18h42
  3. Réponses: 7
    Dernier message: 28/02/2006, 16h46
  4. Comment initialiser une liste de composants avec une boucle ?
    Par EricSid dans le forum Composants VCL
    Réponses: 5
    Dernier message: 06/04/2005, 18h46

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