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 :

Conseils pour coder et probléme entre python 2.6 et 3.1


Sujet :

Python

  1. #1
    Candidat au Club
    Inscrit en
    Août 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 6
    Points : 2
    Points
    2
    Par défaut Conseils pour coder et probléme entre python 2.6 et 3.1
    Bonjour a tous,

    Je suis un nouvel utilisateur de python c'est la première fois que je code . J'ai lu un maximum de tutoriel de FAQ etc. J'ai ecris mon premier programme un programme simple qui permet d'entrer d'effacer et d'afficher des contacts pour faire simple .
    voici le code
    main :
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    import modules, Contact
     
     
    listContacts=[]          
    choixUser=""
     
    while choixUser !='4' :
     
        print('Entrez : 1 pour ajouter un contact')
        print('Entrez : 2 pour enlever un contact')
        print('Entrez : 3 pour lister les contacts')
        print('Entrez : 4 pour sortir ')
        choixlist=["1","2","3","4"]  
     
        choixUser=modules.demandeVerifie(choixlist)
     
        if choixUser == '1' :
     
            chx=raw_input('Entre son nom -->')
            while chx == "" :
                print('Tu dois pas laisser le champs vide')
                chx=raw_input('Entre son nom -->')            
            Contact.ajouterContact(chx, listContacts)
     
        elif choixUser == '2' :
     
            if listContacts != [] :
     
                print('enleve un contact parmis les suivants :')
                Contact.afficherContact(listContacts)
                print ('entre le numero d\'index correspondant au contact a effacer')
                list= [str(x) for x in range(len(listContacts))] # passe la liste d'entier correspondant au index en liste de chaine
                chx=modules.demandeVerifie(list)
                Contact.enleverContact(int(chx), listContacts)
     
            else :
     
                print('la liste de contacts est vide rien a afficher')
     
        elif choixUser == '3' :
     
            Contact.afficherContact(listContacts)
    pour modules.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
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    def demandeVerifie(list) :
        #demande et retourne un bon choix
        #demande ton choix 
        choixUser=raw_input('Entre ton choix  -->')
        #Verifie si ton choix et bon et te redemande jusqu'a ce qu'il le soit
        while verification(choixUser, list) == False :
            print( 'Valeur erronee voici les valeurs justes : {0}'.format(list))
            choixUser=raw_input('entre ton choix -->')
        #retourne un bon choix
        return choixUser  
     
     
    def verification(entree,liste) :
        #verifie si une entree est dans la liste
        a=False
        x=0
        while x<len(liste) :
            if liste[x] == entree :
                a=True
            x+=1
        #retrourne vrai ou faux en fonction
        return a
    et enfin Contact.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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    class Contact :
     
        population=0
     
        def __init__(self,nom):
            self.nom=nom
            Contact.population +=1
     
        def __del__ (self):
            Contact.population -=1
     
        def afficheNom (self):
            return self.nom
     
    def ajouterContact(nom,list):
        list.append(Contact(nom))
     
    def enleverContact(ind,list):
            del list[ind]                
     
    def afficherContact(list):
        if list == [] :
            print('la liste de contact est vide')
        else :
            print('---------------------------------------')
            x=0
            while x<len(list) : 
                temp = list[x].afficheNom()
                print('{0} est en postion index : {1}'.format(temp,x))
                x+=1 
            print('---------------------------------------')
    os : debian squeeze
    IDE: eclipse 3.6 avec pydev 1.6.1.2
    interpreteur : python 2.6

    1)Comme je n'ai jamais codé je voudrais des conseils , savoir ce que j'ai mal fait ce que je peux améliorer dans la façon de coder etc

    2) Le programme tourne (apparemment) normalement sous python 2.6 mais des que je passe avec python 3.1 alors bonjour les dégats. J'ai fait mes recherches et je trouve (dive into python 3) :

    Python 2 had two global functions for asking the user for input on the command line. The first, called input(), expected the user to enter a Python expression (and returned the result). The second, called raw_input(), just returned whatever the user typed. This was wildly confusing for beginners and widely regarded as a “wart” in the language. Python 3 excises this wart by renaming raw_input() to input(), so it works the way everyone naively expects it to work.

    Donc je remplace raw_input() par input() pour que python 3 marche et la bienvenue dans sink into python 3....

    car si effectivement input() dans python 3.1 semble renvoyer une string je dis semble car prenons le bout de code suivant sur python 3.1


    [code]
    p= input()
    print (p)
    eval (p)
    [/code ]

    eval() renvoie une erreur ou on semble voir qu'il parle d'une string .... et pourquoi eval() léve une erreur sur p ....encore plus bizarre ...
    Etant plutôt persistent je passe dans le mode debug de eclipse et si je tape ( dans le bout de code ci -dessus) 1 puis entrée je vois la variable p sous cette forme str : 1\n alors que print n affiche que 1 .

    Ce qui me semble délirant c'est qu'un code sous 2.6 ne passe pas sur 3 .1 que l'inverse soit vrai ok car avec les nouveaux modules etc ca se comprend mais que le code ne soit pas portable de l'ancien au nouveau ca me tue

    Ben voila j'espère avoir été clair merci de m'avoir lu j'attends vos remarques et observations.

    @+

  2. #2
    Rédacteur/Modérateur

    Avatar de Jiyuu
    Homme Profil pro
    Développeur amateur
    Inscrit en
    Janvier 2007
    Messages
    2 456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur amateur
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 456
    Points : 6 789
    Points
    6 789
    Billets dans le blog
    15
    Par défaut
    Alors déjà si ça tourne correcte sous python 2.X, c'est une bonne chose ^^.
    Ce qui me parait bizarre c'est
    Il me semblait que les parenthèses c'étaient du python 3.X... Peut être que ça passe aussi avec les dernières versions de Python 2.X

    Concernant ta façon de coder, je ne préfère pas trop me prononcer car:
    * je suis pour dire que la meilleure façon reste celle qui te convient tant que toi seul manipule ton code
    * je suis loin d'être une référence en matière de bon codage ^^. Après 2 ans de tout et n'importe quoi, je me décide enfin à faire des efforts pour mieux structurer mes scripts.

    Ensuite que tu es des soucis avec Python 3.X alors que tu n'en as pas avec Python 2.X est normal... les deux versions ne sont pas (entièrement) compatible.

    Cependant lorsque tu installes Python 3.X, tu installes aussi un module 2to3.py qui te permets de recoder automatiquement ton code python 2.X en 3.X

    Je l'ai essayé récemment pour faire des tests (j'ai d'ailleurs à cette époque ouvert un topic de mémoire). 2to3.py m'a donné entière satisfaction.

    Sous windows un .bat du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    python 2to3.py -w essai.py
    pause
    permet de réécrire essai.py en python 3.X.
    Il y a d'autres arguments passable pour "customiser" la transformation.

    Par contre attention, un certain nombre de biblio ne sont pas dispo sous Python 3.X (wxPython notamment ce qui est un réel manque), et ça tu peux rien y faire pour le moment ^^
    (ou si en reprennant tous les scripts de la biblio wxPython avec 2to3.py peut être ^^).

    Bonne continuation
    Initiation à Qt Quick et QML : Partie 1 - Partie 2
    En cas de besoin, pensez à la
    Mon site et mes tutoriaux sur Developpez.com
    Pas de question technique par MP... Les forums sont là pour ça

  3. #3
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Points : 970
    Points
    970
    Par défaut
    bonjour,

    pour l'organisation du code à proprement parlé, je vois une seule chose qui m'embête vraiment.

    Pourquoi traiter un contact avec une approche orientée objet et la liste des contacts avec une approche procédurale ?

    Personnellement, je serais plus parti vers quelque chose comme ceci (en orienté objet):

    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
     
    class Contact(object): #object si tu es en python2.
     
        def __init__(self,nom):
            self.nom=nom
     
        def afficheNom (self):
            return self.nom
     
        def __str__(self):
            """
            c'est la fonction qui va être appelée lorsque tu fais:
            "str(contact)"
            """
            return "Contact(nom='%s')" % self.nom
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    class Contacts(object): #même remarque
     
        def __init__(self):       
            #je pars avec un dictionnaire pour avoir des clés (plus simple que les indices dans ce cas)
            self._list = {}
     
        def ajouterContact(self, obj):
            """
            la fonction est conçue de telle sorte que je peux passer en argument:
            - soit une chaine de texte (un object Contact est alors crée)
            - soit directement un objet Contact
            """
            try:
                k = obj.afficheNom()
                v = obj
            except AttributeError:
                k = obj
                v = Contact(str(obj))    
            self._list[k] = v
     
        def enleverContact(self, nom):
            """
            ici en spécifiant un nom, on peut directement accéder au Contact (comme dans un répertoire quoi...)
            """
            self._list.pop(nom, None)
     
        def population(self):
            """
            population est ici dynamique, il renvoie la taille du dictionnaire
            plus besoin donc de garder un compteur
            """
            return len(self._list)
     
        def __len__(self):
            """
            même chose que population. en général on surcharge l'opérateur len 
            à la place de créer une méthode qui compte. 
            c'est le nom Python réservé.
            cette méthode est appelée quand:
            - tu fais "len(contacts)" (c'est alors équivalent à un appel à "contacts.population()"
            - tu fais "if contacts" (c'est équivalent à "if len(contacts) != 0")
            on ne teste pas une liste vide comme ceci:
            "if l == []:"
            mais comme ceci:
            "if l:"
            """
            return len(self._list)
     
        def afficherContact(self):
            if not self._list:
                print 'la liste de contacts est vide'
            else :
                print '-'*40
                for k, v in self._dict.items():
                    print "{0}: {1}".format(k, v)
                print '-'*40
    edit: beuh pourquoi j'ai pas la coloration syntaxique :'(
    edit2: en fait on peut pas mettre de balise dans les commentaires

  4. #4
    Candidat au Club
    Inscrit en
    Août 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    Merci Jiyuu je verrais comment 2to3.py se charge du input() car je n'y suis pas arriver.

    kango je n'avais créer de class ContactsListe en me disant crée une classe pour instancier un seul objet liste c'est pas utile mais finalement vaut mieux le faire.

    Plusieurs petite question pourquoi trouves tu le dico mieux que la liste ici car quand tu rentres par exemple un nom et que tu appelles ta fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        def enleverContact(self, nom):
            """
            ici en spécifiant un nom, on peut directement accéder au Contact (comme dans un répertoire quoi...)
            """
            self._list.pop(nom, None)

    si plusieurs contact on le même nom tu te retrouves avec plusieurs keys identiques correspondant a plusieurs contacts différents dans ton dico d'ailleurs je me demande si python sur le dico te laisse rentrer deux objets avec la même key je pense pas...enfin j'ai pas essayer.

    Là ou je suis curieux c'est ca :
    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 __len__(self):
            """
            même chose que population. en général on surcharge l'opérateur len 
            à la place de créer une méthode qui compte. 
            c'est le nom Python réservé.
            cette méthode est appelée quand:
            - tu fais "len(contacts)" (c'est alors équivalent à un appel à "contacts.population()"
            - tu fais "if contacts" (c'est équivalent à "if len(contacts) != 0")
            on ne teste pas une liste vide comme ceci:
            "if l == []:"
            mais comme ceci:
            "if l:"
            """
            return len(self._list)
    Donc en clair "if l :" (avec l instance de l'objet de la classe Contacts) cela revient a "if len(contacts) != 0" ... la j'ai du mal pourquoi car if regarde toujours une condition qu'elle analyse en True ou False or l'objet l ne renvoie pas de booléen par défaut, comment python comprend cela ?

    encore merci ^^

  5. #5
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Points : 970
    Points
    970
    Par défaut
    si plusieurs contact on le même nom tu te retrouves avec plusieurs keys identiques correspondant a plusieurs contacts différents dans ta liste d'ailleurs je me demande si python sur le dico te laisse rentrer deux objets avec la même key je pense pas...enfin j'ai pas essayer.
    c'est exactement ça. si le nom des contacts n'est pas unique alors le dico n'est pas forcément une bonne idée: dans un dico les clés sont uniques.

    alors, soit on utilise une liste soit on continue à utiliser un dico mais on "indexe" plus avec le nom mais avec autre chose d'unique (genre un id).

    ensuite, fais ce petit test:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    l = []
    if not l:
       print "je suis vide"
    l.append(1)
    if l:
       print "je ne suis pas vide"
    une liste est Vrai si elle contient au moins un élément et False sinon
    c'est pour cela que je dis que c'est équivalent à:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if len(l) != 0:
       print "je ne suis pas vide"
    et cela est vrai pour tous les objets de type séquence: listes, tuples, dictionnaires, sets et même pour les chaines de caractères.

  6. #6
    Candidat au Club
    Inscrit en
    Août 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Merci kango ^^

    tant que je t'ai sous la main

    Une petite précision j'ai un collégue au boulot qui me dit que je ne devrais pas mettre de print() ailleurs que dans Main.py car au moment de réaliser une GUI je vais être bloquer et obliger de reprendre le code . (vrai/ faux) ?

    il me dit de bien mettre toutes les classes dans un seul fichiers ex Classes.py (ss réserves qu'elles ne soient pas trop importantes chacune ) et de mettre toutes les méthodes qui ne sont pas des méthodes de classe dans un fichier a part ex : methodes.py (vrai/faux) ?

    Il me dit d'instancier au minimum en "statique" mais de le faire au maximum de façon dynamique : les méthodes de classes sont la pour ça selon lui (vrai/faux)?

    enfin comme je débute je préfère m'assurer de ce que je fais.... le plus proprement possible des le début car les mauvaises habitudes sont dures a perdre après....

    et encore merci kango pour tes réponses^^

  7. #7
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Points : 970
    Points
    970
    Par défaut
    si le code dois être appelé depuis une gui, ce n'est pas très gênant qu'il y ait des messages:

    soit tu as une console avec la gui auquel cas les messages seront écris dedans
    soit tu n'as pas de console et les messages ne s'afficheront pas

    donc voilà pour des print c'est pas gênant, c'est pas comme si tu avais des raw_input()

    pour la répartition des classes fonctions dans les différents fichiers .py j'ai envie de dire qu'il y a pas trop de règles... disons qu'il faut les regrouper par thèmes pas mélanger les choux et les salades et faire en sorte qu'il y ait pas de carottes un peu partout...

    désolé, je ne comprends pas l'instanciation "statique", ça n'a pas de sens dans un langage typé dynamiquement comme Python. Et je ne vois pas non plus le rapport avec le fait d'utiliser des méthodes de classes.

    ah ! je suis content, 3 questions où je devais répondre par vrai ou faux et où je me suis dérobé à chaque fois !

  8. #8
    Candidat au Club
    Inscrit en
    Août 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    arff

    je suis allé trop vite pas print() mais input() ou raw_input pardon .....je pensais input() j'ai marqué print() je suis distrait ces temps derniers

    encore merci pour tes réponses kango

  9. #9
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Eh bien comme je n'arrive pas à dormir, je me suis amusé à faire un petit programme de ce type.

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    class contact(object):
        def __init__(self):
            self.liste=[]
        def ajout(self, nom):
            if nom not in self.liste: self.liste.append(nom)
            else: print "Nom deja existant"
        def retrait(self, nom):
            if nom in self.liste: self.liste.remove(nom)
            else: return "Nom inexistant"
        def __len__(self):
            if self.liste: print len(self.liste)
            else: print "liste vide"
        def update(self):
            print self.liste
     
    def menu():
        print """Faites votre choix
    %s
    1- Ajouter un contact
    2- Supprimer un contact
    3- Taille du repertoire
    4- Afficher la liste des contacts
    5- Quitter""" %("-"*len("Faites votre choix"))
     
    def name():
        nom_contact=raw_input("Donner le nom a traiter :")
        return nom_contact
     
    c=contact()
    while 1:
        menu()
        choix=raw_input("Faites votre choix :")
        if choix=="1": c.ajout(name())
        elif choix=="2": c.retrait(name())
        elif choix=="3": c.__len__()
        elif choix=="4": c.update()
        elif choix=="5": break
        else: continue
    Ça donne plusieurs façon de faire
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

Discussions similaires

  1. De précieux conseils pour résoudre vos problèmes
    Par Laurent Dardenne dans le forum Débuter
    Réponses: 2
    Dernier message: 08/09/2014, 20h56
  2. Conseil pour coder un logiciel tout simple
    Par B65AcR dans le forum Autres Logiciels
    Réponses: 1
    Dernier message: 02/04/2014, 23h37
  3. Réponses: 0
    Dernier message: 10/07/2012, 14h33
  4. Conseil pour "coder" sur un forum php
    Par chtitaz dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 20/08/2010, 00h03
  5. [Écran] Conseil pour achat suite problèmes de migraine
    Par Leclandestin dans le forum Périphériques
    Réponses: 8
    Dernier message: 26/03/2008, 17h29

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