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 !
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
- 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 ...
Lookap, le Job board innovant pour Frelancers : http://lookap.me
Alors, oui c'est un dictionnaire bien vu ! mais l'erreur ne vient pas de cette ligne
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
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
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
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.
@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 !
@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.
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 ?
× 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.
Python c'est bon, mangez-en.
Python c'est bon, mangez-en.
Python c'est bon, mangez-en.
Python c'est bon, mangez-en.
Python c'est bon, mangez-en.
Python c'est bon, mangez-en.