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 avec exec et strptime


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 5
    Par défaut Problème avec exec et strptime
    Bonjour, j'ai un problème lors de l'utilisation de la fonction exec.

    La ligne est :


    exec("D%s=time.strptime(T%s,'%m/%d/%Y %I:%M:%S %p')"%(i,i))

    En gros, cette commande est dans un boucle ou i prends les valeur de 1 à 11. J'ai construit auparavant des dates T1 à T11 et je veux construire des vecteur D1 à D11 avec strptime.

    Selon Python, la commande ne fonctionne pas car je n'ai pas suffisamment d'argument pour exécuté la string. Comment puis-je appliquer la variation de i à %s uniquement.

  2. #2
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonjour,

    Et bien oui, pour la logique de construction du string il manque des arguments car le formatage de time.strptime ('%m/%d/%Y %I:%M:%S %p') n'est pas compris et Python attend m, un décimal, Y etc...
    Un 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
    >>> for i in range(5):
    ...     print("D%d = time.strptime(T%d)"% (i, i))
    ... 
    D0 = time.strptime(T0)
    D1 = time.strptime(T1)
    D2 = time.strptime(T2)
    D3 = time.strptime(T3)
    D4 = time.strptime(T4)
    >>> for i in range(5):
    ...     print("D%d = time.strptime(T%d, '%m')"% (i, i))
    ... 
    Traceback (most recent call last):
      File "<stdin>", line 2, in <module>
    TypeError: not enough arguments for format string
    Comme vous le voyez cela ne viens pas d'exec mais de la construction du string. Vous noterez aussi que ce n'est pas %s (D%s) qui demande un string mais %d pour un int.
    Vous devez donc le construire autrement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> for i in range(5):
    ...     print("D%d = time.strptime(T%d"% (i, i) + ", '%m/%d/%Y %I:%M:%S %p')")
    ... 
    D0 = time.strptime(T0, '%m/%d/%Y %I:%M:%S %p')
    D1 = time.strptime(T1, '%m/%d/%Y %I:%M:%S %p')
    D2 = time.strptime(T2, '%m/%d/%Y %I:%M:%S %p')
    D3 = time.strptime(T3, '%m/%d/%Y %I:%M:%S %p')
    D4 = time.strptime(T4, '%m/%d/%Y %I:%M:%S %p')
    Ceci dit utiliser exec pour une création dynamique de variable c'est quand même utiliser du lourd... Je vous recommanderais plutôt l'utilisation du dico globals()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> for i in range(5):
    ...     globals()["T%d"% i] = "Nov 30 200%d"% i
    ... 
    >>> print(T0)
    Nov 30 2000
    Voir setattr si vous êtes dans une fonction ou un module.

    @+

  3. #3
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Re,

    J'allais oublier à propos d'exec : Pensez à lui donner un namespace.

    Exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> for i in range(10):
    ...     exec("D%d = %d"% (i, i))
    ... 
    >>> print(D0)
    0
    Pas de problème

    test.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for i in range(10):
        exec("D%d = %d"% (i, i))
     
    print(D5)
    sortie
    Toujours pas de problème

    test.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def createvar():
        for i in range(10):
            exec("D%d = %d"% (i, i))
     
        print(D5)
     
    createvar()
    sortie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Traceback (most recent call last):
      File "test.py", line 7, in <module>
        createvar()
      File "test.py", line 5, in createvar
        print(D5)
    NameError: global name 'D5' is not defined
    Aie.

    Donc pensez bien à lui passer un namespace:

    test.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def createvar():
        for i in range(10):
            exec("D%d = %d"% (i, i), globals())
     
        print(D5)
     
    createvar()
    sortie
    @++

    Edit: Et pour finir la démo avec setattr/globals()
    test.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    def createvar():
        for i in range(10):
            setattr(createvar, "D%d"% i, i)
     
        print(createvar.D5)
     
    def createvar1():
        for i in range(10):
            globals()["T%d"% i] = i
     
        print(T5)
     
    createvar()
    createvar1()
    sortie

  4. #4
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Et bien... Je pensez avoir fais le tour de la question mais pas tout à fait.

    Pourquoi globals() et pas locals() ?
    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
    def createvar1():
        for i in range(10):
            exec("I%d = %d"% (i, i), globals())
     
        print(globals()['I5'])
        return I5
     
    print(createvar1())
     
    def createvar2():
        for i in range(10):
            exec("J%d = %d"% (i, i), locals())
     
        print(locals()['J5'])
        return J5
     
    print(createvar2())
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    5
    5
    5
    Traceback (most recent call last):
      File "test.py", line 17, in <module>
        print(createvar2())
      File "test.py", line 15, in createvar2
        return J5
    NameError: global name 'J5' is not defined
    Pour comprendre cela je vous invite à lire excellente prose de notre ami dividee.

    Je pense que c'est tout

    @+

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 5
    Par défaut
    Merci beaucoup c'est très instructif.

    Je suis nouveau sur python et j'ai peut-être pris la mauvaise habitude d'utilisé la fonction exec trop souvent.

    Est-ce que je peux savoir ce qui la rends plus lourde?

    Merci d'avance

  6. #6
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    exec n'est pas si lourd que cela, puissant oui.
    Que pensez vous d'une fonction qui permet d’exécuter dynamiquement du code Python à partir d'un string, un fichier ou d'un code ? Costaud non ?
    Si vous questionnement viens du globals() voici ce qui est dit pour exec:
    In all cases, if the optional parts are omitted, the code is executed in the current scope. If only the first expression after in is specified, it should be a dictionary, which will be used for both the global and the local variables. If two expressions are given, they are used for the global and local variables, respectively. If provided, locals can be any mapping object.
    Je trouve cela bien vu la puissance d'exec.
    Comme je le dit dans un autre sujet aujourd’hui en Python on considère que le développeur est 'responsable', à lui de l’être avec ce genre de fonction.

  7. #7
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Citation Envoyé par PauseKawa Voir le message
    Ceci dit utiliser exec pour une création dynamique de variable c'est quand même utiliser du lourd...
    C'était a comprendre dans le sens 'artillerie lourde'

Discussions similaires

  1. Problème avec exec()
    Par riadh8 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 30/04/2011, 12h27
  2. Problème avec exec !
    Par kergad dans le forum Langage
    Réponses: 7
    Dernier message: 12/12/2009, 23h13
  3. Problème avec exec()
    Par heliophane dans le forum Langage
    Réponses: 2
    Dernier message: 16/09/2009, 09h32
  4. [find] Problème avec -exec
    Par kromartien dans le forum Shell et commandes GNU
    Réponses: 9
    Dernier message: 06/11/2007, 17h09
  5. Problème avec exec()
    Par bibou dans le forum Langage
    Réponses: 4
    Dernier message: 11/07/2007, 12h13

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