Partage
  • Partager sur Facebook
  • Partager sur Twitter

Exercice pour noob-J'ai bloqué, à vous de jouer !

    16 mai 2014 à 10:01:16

    Bonjour les copains !

    Je me suis bloqué sur une erreur, pendant une bonne dizaine de minutes avant me rendre compte de ma noobtitude.

    Je sais qu'il existe un sujet pour les exos, mais il est simple et n'en vaut pas la peine, c'est une erreur glissé dans une fonction.

    Le but ?

    Pour les débutants qui ne maitrisent pas encore le langage, j'espère qu'ils en apprendront un peu.

    def affiche_page( self, num = False ):
        ''' Affiche intégralement la / les page(s) '''
        if num == False :
            for page in self.pages.values():
                print self.pages.raw_page
        else:
            for page in num:
                print self.pages[page].raw_page

    La fonction n'est pas testable héhé ! du coup cela oblige à réfléchir sur comment cela fonctionne.

    Pour les autres, j'aimerai une optimisation, mais pas de réponse avant qu'un " nouveau trouve " !

    Et je vous connais moi, je sais qui sont les habitués du forum !

    -
    Edité par MonsieurVaros 16 mai 2014 à 10:01:29

    • Partager sur Facebook
    • Partager sur Twitter
    Python, simple et puissant !
      16 mai 2014 à 10:17:08

      Hum la rapidement sans vérifier mes dires ( je ne suis pas très famillié avec les fonctions à paramètres prédéfinies) je proposerai :

      -Tu itères sur num mais tu fais un test dessus au préalable , ça me semble bizzare :ninja:

      - Ou alors peut-être vu que tu appliques la méthode values() sur pages , j'imagine que c'est un dictionnaire et derrière il y a ce printself.pages[page] 

      avec page entre crochet ...

      • Partager sur Facebook
      • Partager sur Twitter
      Lookap, le Job board innovant pour Frelancers : http://lookap.me
        16 mai 2014 à 10:21:47

        Alors, oui c'est un dictionnaire bien vu ! mais l'erreur ne vient pas de cette ligne :magicien:

        Ensuite l'erreur ne vient pas de l’itération de num. C'est pas beau mais cela se fait. Je m'en sers pour récupérer chaque élément de num. Il faut donc en déduire que num est une liste ^^

        Continue !

        • Partager sur Facebook
        • Partager sur Twitter
        Python, simple et puissant !
          16 mai 2014 à 10:28:03

          ligne 5 ?
          • Partager sur Facebook
          • Partager sur Twitter

          Python c'est bon, mangez-en. 

            16 mai 2014 à 10:29:04

            Yes :magicien: ! Mais pourquoi ?

            Je donne l'erreur :

            'dict' object has no attribute 'raw_page'

            -
            Edité par MonsieurVaros 16 mai 2014 à 10:31:27

            • Partager sur Facebook
            • Partager sur Twitter
            Python, simple et puissant !
              16 mai 2014 à 10:29:57

              Il manque pas des parenthèses à ta méthode raw_page()?
              • Partager sur Facebook
              • Partager sur Twitter
              Précepte: Le mieux est l'ennemi du bien
                16 mai 2014 à 10:32:56

                Bien tenté mais j'ai mis l'erreur sinon c'est impossible. ( voir mon post d'avant )

                Du coup si il n'y pas de parenthèse, que peut on en déduire du dictionnaire ?

                -
                Edité par MonsieurVaros 16 mai 2014 à 10:33:16

                • Partager sur Facebook
                • Partager sur Twitter
                Python, simple et puissant !
                  16 mai 2014 à 10:36:21

                  Je retire ma réponse :)

                  -
                  Edité par Olygrim 16 mai 2014 à 10:40:43

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Précepte: Le mieux est l'ennemi du bien
                    16 mai 2014 à 10:36:40

                    Olygrim, je pense que raw_page est une @property

                    sinon je ne peux pas répondre, je ne suis pas complètement noob, je laisse réfléchir d'autres.

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Python c'est bon, mangez-en. 

                      16 mai 2014 à 10:39:41

                      Olygrim, t'es gonflé de dire que t'es débutant ! Ca va la modestie ! ^^ haha !

                      Enlève moi cette réponse tout de suite !

                      Josmiley " pas complètement " > pas du tout même ? haha. Et bien tenté aussi mais ce n'est pas une property !

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Python, simple et puissant !
                        16 mai 2014 à 10:46:04

                        effectivement c'est le 's' de pages qui m'a orienté vers une class dérivée de dict

                        mais puisque c'est là que se trouve l'erreur ...

                        sinon:

                        def affiche_page( self, num = False ):
                            ''' Affiche intégralement la / les page(s) '''
                            for page in num or self.pages.keys():
                                print self.pages[page].raw_page



                         ça le fait ou pas ?

                        -
                        Edité par josmiley 16 mai 2014 à 11:01:18

                        • Partager sur Facebook
                        • Partager sur Twitter

                        Python c'est bon, mangez-en. 

                          16 mai 2014 à 10:51:02

                          Non ! mais bien tenté. Veux tu un indice ?

                          Le else est bon, pas besoin d'y toucher c'est vraiment la ligne 5 qu'il faut modifier. C'est un compréhension de la boucle.

                          Qui boucle ? et sur quoi ?

                          -
                          Edité par MonsieurVaros 16 mai 2014 à 10:53:50

                          • Partager sur Facebook
                          • Partager sur Twitter
                          Python, simple et puissant !
                            16 mai 2014 à 10:57:04

                            j'ai dans l'idée num est une liste des clés du dictionnaire self.pages, non ?

                            sinon j'ai édité le code précédent.

                            -
                            Edité par josmiley 16 mai 2014 à 11:01:47

                            • Partager sur Facebook
                            • Partager sur Twitter

                            Python c'est bon, mangez-en. 

                              16 mai 2014 à 11:03:33

                              Je te recentre :

                              • Avec ce qu'il y a dans le else, tu dois pouvoir en déduire la nature du dictionnaire , de l'objet qu'il contient.
                              • Du coup, page représente un objet. Mais moi je fais quoi derrière ?
                              • ton idées du 's' était bonne.
                              • Partager sur Facebook
                              • Partager sur Twitter
                              Python, simple et puissant !
                                16 mai 2014 à 11:11:38

                                on ne s'est pas compris

                                je répond à la deuxième question puisque j'ai vu olygrim répondre à la première (depuis il à retiré sa réponse)

                                je propose comme optimisation(en nombre de lignes, pas en efficacité) le code suivant:

                                def affiche_page( self, num = False ):
                                    ''' Affiche intégralement la / les page(s) '''
                                    for page in num or self.pages.keys():
                                        print self.pages[page].raw_page



                                -
                                Edité par josmiley 16 mai 2014 à 11:12:10

                                • Partager sur Facebook
                                • Partager sur Twitter

                                Python c'est bon, mangez-en. 

                                  16 mai 2014 à 11:17:16

                                  Cela marche ! Merci c'est pas mal du tout tiens.

                                  -
                                  Edité par MonsieurVaros 16 mai 2014 à 11:19:04

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  Python, simple et puissant !
                                    16 mai 2014 à 19:15:21

                                    ah oui tien ça y est, j'ai trouvé!

                                    J'ai mis du temps à comprendre, rhaaaa:colere:!

                                    EDIT; et en plus je me suis planté mais cette fois j'ai trouvé la solution!:colere2:

                                    -
                                    Edité par pythan 16 mai 2014 à 21:33:09

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    Bevet Breizh! Breizh dizalc'h! Betek an trec'h! Ha mallozh ruz d'ar c'hallaoued! Trouvez votre voie
                                      16 mai 2014 à 22:47:25

                                      Cette fonction est intéressante à un autre égard. Poursuivons l'exercice.

                                      num est affecté avec la valeur par défaut False, booléenne, alors que c'est une liste. D'aucuns y verront comme une couille dans le potage... Sémantiquement parlant, c'est confus, donc sale.

                                      On pourrait se dire qu'on devrait donner le bon type directement à num, donc être tenté d'écrire :

                                      def affiche_page(self, num=[]):
                                      

                                      Seulement affecter une liste comme valeur par défaut d'un argument est à éviter, parce que c'est généralement une très mauvaise idée (même si dans le cas particulier de cette fonction, à condition qu'elle ne bouge pas, ça ne poserait pas de problème).

                                      Pouvez-vous dire pourquoi ?

                                      Que faire alors pour éviter d'induire en erreur les gens qui utiliseront ou maintiendront cette fonction, à laquelle on peut passer une ou plusieurs pages, en option, à visualiser ?

                                      Il y a au moins 2 solutions propres. L'une plus pythonique que l'autre. ;)

                                      -
                                      Edité par nohar 16 mai 2014 à 22:53:49

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      Zeste de Savoir, le site qui en a dans le citron !
                                      Anonyme
                                        16 mai 2014 à 23:03:02

                                        Je crains qu'il soit difficile de comprendre le problème avec cette fonction en exemple, mais j'ai peur de spoil avec un autre exemple...

                                        Par contre je dois être fatigué parce qu'il m'aura fallu un peu de temps avant de voir la soluce pythonique. ;)

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          16 mai 2014 à 23:34:02

                                          @psycopy : l'important c'est que quelqu'un finisse par donner la solution. Si tu penses que ça mérite un indice, fais-toi plaisir. ;)

                                          Je trouve que c'est une bonne occasion de voir cette best-practice. On ne la croise pas souvent, mais l'avoir déjà vu permet d'éviter des bugs particulièrement vaches à diagnostiquer !

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                          Zeste de Savoir, le site qui en a dans le citron !
                                            16 mai 2014 à 23:38:40

                                            peut-être ?

                                            def affiche_page(self,*num):
                                                for page in num or self.pages.keys():
                                              print self.pages[page].raw_page


                                            après je ne vois pas de deuxième ...

                                            -
                                            Edité par josmiley 16 mai 2014 à 23:42:18

                                            • Partager sur Facebook
                                            • Partager sur Twitter

                                            Python c'est bon, mangez-en. 

                                            Anonyme
                                              16 mai 2014 à 23:55:00

                                              nohar a écrit:

                                              @psycopy : l'important c'est que quelqu'un finisse par donner la solution. Si tu penses que ça mérite un indice, fais-toi plaisir. ;)

                                              Je dois prendre le problème à l'envers parce que je n'ai qu'un exemple où il est utile (mais pas forcément pythonique) de mettre un mutable en argument par défaut mais je n'en trouve pas de correct pour montrer l'erreur que ça peut provoquer si on n'y fait pas attention.

                                              Donc comme j'ai pas de cerveau ce soir, je propose un tour sur le tuto officiel

                                              josmiley a écrit:

                                              peut-être ?

                                              def affiche_page(self,*num):
                                              for page in num or self.pages.keys():
                                              print self.pages[page].raw_page


                                              après je ne vois pas de deuxième ...

                                              L'autre solution (moins pythonique à mon sens) c'est de définir à None.

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                17 mai 2014 à 1:58:00

                                                Exactement ! Une liste d'arguments optionnels. C'est tellement plus pratique. :)

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                Zeste de Savoir, le site qui en a dans le citron !
                                                  18 mai 2014 à 17:22:14

                                                  Je reviens d'un long week end de saoulerie intensive, je vous avoue qu'avec 2heures de route en plein soleil dans ma fiesta sur l'A6, j'ai eu du mal à comprendre ! Enfait j'ai surtout rien compris , la solution est donc de définir à None ?
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                  Python, simple et puissant !
                                                    19 mai 2014 à 3:29:54

                                                    Dessoûle et relis le thread.

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                    Zeste de Savoir, le site qui en a dans le citron !

                                                    Exercice pour noob-J'ai bloqué, à vous de jouer !

                                                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                    • Editeur
                                                    • Markdown