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 :

Nom de certains objets


Sujet :

Python

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 49
    Points : 45
    Points
    45
    Par défaut Nom de certains objets
    Bonjour,

    Pour m'aider à déboguer, à certains endroits du programme quand ça plante ou retourne un résultat inattendu, je mets une instruction print du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print "maliste = ",maliste
    J'ai voulu m'en faire une plus courte avec une fonction du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def pp(monObbjet):
    print monObjet.__name__, "= ", monObjet
    Le hic est qu'un objet comme une liste, etc, n'a pas d'attribut name. Donc ça ne marche pas...

    Quelqu'un a-t-il une idée ?
    D'avance merci
    Dominique

  2. #2
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 181
    Points : 199
    Points
    199
    Par défaut
    Je ne comprends pas ton problème.
    Si les objets avaient un attribut __name__, à quoi devrait-il correspondre ?
    Au nom de la variable qui contiendrait cet objet ?
    Mais en Python, les variables ne sont en réalité qu'une référence vers un objet, et non l'objet lui même. Un même objet peut avoir plein de références (on parle alors d'alias).

    De plus en python, tout est objet, et chaque objet à un type. Les types intégrés disposent déjà d'une représentation de leur valeur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    >>> (42).__class__
    <type 'int'>
    >>> "bonjour".__class__
    <type 'str'>
    >>> "bonjour".__class__.__name__
    'str'
    >>> open("plop", "w").__class__
    <type 'file'>
    Et quel est l'intérêt de passer par une fonction ? C'est plus long qu'avant, ça n'apporte rien de plus.
    M'enfin bref, je ne vois vraiment pas où tu veux en venir.
    <3 Debian
    [ C | C++ | PHP | Python ]

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 49
    Points : 45
    Points
    45
    Par défaut
    Merci Haze d'avoir pris de ton temps pour me répondre.

    Puisque je n'ai pas été très clair, je précise:

    1) je ne suis pas développeur professionnel, tu l'avais compris. J'aurais bien voulu passer directement du statut de novice à celui d'expert, mais ce n'est pas possible. J'apprends tout seul dans mon coin. Et petit à petit, je progresse. J'arrive même à faire de petits programmes en wx qui fonctionnent très bien. Mais malheureusement, je bute souvent sur de petits problèmes très basiques.

    2) Le but, c'est de faire un raccourci sur print puisque je ne maîtrise pas les techniques de débogage.
    Ainsi ,lorsque j'ai une instruction au milieu de mon programme du genre:
    Code1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ceciEstUnLongNomDeVariableQuIlEstCassepiedDeRecopier=[uneListe[3],uneAutreListe[1][4]]
    et que mon programme plante à ce moment-là ou me donne un résultat incohérent, et que je pense que l'erreur vient de là, je fais :
    Code2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print "ceciEstUnLongNomDeVariableQuIlEstCassepiedDeRecopier = ",ceciEstUnLongNomDeVariableQuIlEstCassepiedDeRecopier
    ce qui me permet de voir le nom de ma variable, son contenu et de corriger. C'est souvent le cas lorsque ma variable (une liste par ex) est elle-même constituée d'autres variables,...
    Ouf...
    Je sais bien que ce n'est pas comme cela qu'il faudrait faire, mais c'est ce que j'ai trouvé de plus facile.

    Le but du jeu est donc de faire un raccourci du genre:
    Code3:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pp(ceciEstUnLongNomDeVariableQuIlEstCassepiedDeRecopier)
    qui soit équivalent à taper le code Code2 mais qui me permette d'aller plus vite (Oui, je sais, il y a aussi le copier/coller !!).
    Plus long à expliquer qu'à faire.

    Si les objets avaient un attribut __name__, à quoi devrait-il correspondre ?
    Au nom de la variable qui contiendrait cet objet ?
    C'est ce qui m'arrangerait !!



    Voilà. Ouf.

    Ne serait-ce que par curiosité, j'aimerais bien savoir comment faire.
    Si quelqu'un a une idée, d'avance merci.
    Sinon, je survivrai!!! Merci encore à Haze.

    Dominique

  4. #4
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 181
    Points : 199
    Points
    199
    Par défaut
    Salut,

    J'ai compris ton problème, voici la solution que tu cherchais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def pp(nom_var):
        print nom_var, ":", eval(nom_var)
    Tu utilises la fonction quasiment de la même façon, la différence est qu'il faut passer le nom de la variable en argument sous la forme d'une chaîne de caractères :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> une_variable_avec_un_nom_tres_long = "Bonjour"
    >>> pp("une_variable_avec_un_nom_tres_long")
    une_variable_avec_un_nom_tres_long : Bonjour
    La fonction eval permet d'évaluer une chaîne de caractères directement dans une instruction.
    Cependant, même si la méthode que je viens de montrer marche, elle n'est pas très propre : en effet l'usage de la fonction eval est déconseillé.


    Si tu veux vraiment débugger proprement ton programme, il existe déjà des outils prévus pour ça.
    Tu devrais regarder le module Python DeBugger (module pdb), fourni de base dans ton installation.
    Ce module permet d'avoir la valeur de n'importe quelle variable à tout moment juste en tapant son nom, changer la valeur d'une variable, et encore plein d'autres choses et le tout pendant l'exécution du script !

    Voici un tutoriel d'introduction à pdb, c'est vraiment simple à utiliser.
    http://www.ferg.org/papers/debugging_in_python.html


    Autre chose encore : tu dis que c'est casse pieds de recopier les noms des variables, mais de nombreux éditeurs de texte peuvent s'en charger à ta place grâce à l'autocomplétion. Tu tapes juste les 3 premières lettres et le reste s'écrit tout seul
    Vim, Kate, Scribes, Notepad++ ont cette fonctionnalité (il y en a d'autres bien sûr).
    <3 Debian
    [ C | C++ | PHP | Python ]

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 49
    Points : 45
    Points
    45
    Par défaut Super
    Merci beaucoup Haze.

    Sympa d'avoir pris de ton (précieux) temps pour moi. Je m'en vais étudier le tuto de ce pas.

    Dis-toi bien que plus tard, j'espère bien pouvoir répondre à mon tour à la bleusaille !!!

    Encore merci
    Dominique

  6. #6
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 181
    Points : 199
    Points
    199
    Par défaut
    De rien !
    Quant à mon "précieux" temps, je ne suis qu'un étudiant en vacances, je ne suis pas vraiment débordé

    Au fait, IDLE dispose lui aussi d'un débugger intégré avec une interface graphique, peut-être qu'il te semblera plus simple d'utilisation que le module pdb.
    Mais de toute façon, si tu veux utiliser un débugger il faudra t'investir un minimum pour apprendre à t'en servir.

    Personnellement j'en utilise pas, c'est surtout utile pour les gros projets, où trouver la source d'un problème peut s'avérer difficile.
    Pour les petits programmes, je trouve que de simples instructions print suffisent.
    <3 Debian
    [ C | C++ | PHP | Python ]

Discussions similaires

  1. Nom d'un objet swing
    Par menuge dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 09/05/2006, 17h09
  2. [POO] Contenu d'une variable nom d'un objet
    Par reventlov dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 01/05/2006, 17h04
  3. Recuperer le nom de l'objet du champ en cours.
    Par gregco1 dans le forum Débuter
    Réponses: 3
    Dernier message: 12/02/2006, 14h36
  4. [c#] nomer nom d'un objet..
    Par orelero dans le forum C#
    Réponses: 9
    Dernier message: 22/12/2005, 19h11
  5. Réponses: 7
    Dernier message: 03/12/2004, 12h40

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