OVH Cloud OVH Cloud

probleme d'héritage

7 réponses
Avatar
Andréï
Salut,
je fait actuellement un petit prog mais je bloque sur probleme:

voici mon code:
#############DEBUT PROG###############
import poplib
class mail(poplib):
def __init__(self,serveur,login,mdp):
self.host = serveur
self.login = login
self.mdp = mdp

def connection(self):
try:
self.POP3(self.host)
self.user(self.login)
self.mdp(self.mdp)
resultat = True
except:
resultat = False
return resultat

def .... autres methodes
###########FIN DE LA CLASSE#############

m = mail('pop.nordnet.fr','xxxxxxxxxxx','xxxxxxxx')
try:
print m.connection()
print m.listesujets()
finally:
m.POP3.quit()
############FIN PROG################

Quand j'exécute ce petit prog il me dit que j'initialise m avec trop
d'arguments. (3 au lieu de 2)
Auriez vous une idée?
merci.

7 réponses

Avatar
Hervé Cauwelier
Quand j'exécute ce petit prog il me dit que j'initialise m avec trop
d'arguments. (3 au lieu de 2)
Auriez vous une idée?
merci.


Je crois que t'essayes d'hériter d'un module. :-)

Je pense que c'est la classe poplib.POP3 qui t'intéresse.

--
Hervé Cauwelier
http://www.oursours.net/

Avatar
bruno at modulix
Andréï wrote:
Salut,
je fait actuellement un petit prog mais je bloque sur probleme:

voici mon code:
#############DEBUT PROG###############
import poplib
class mail(poplib):
def __init__(self,serveur,login,mdp):
self.host = serveur
self.login = login
self.mdp = mdp

def connection(self):
try:
self.POP3(self.host)
self.user(self.login)
self.mdp(self.mdp)


tu es sûr de ton code, là ?

resultat = True
except:


Argh. Une clause except 'catch_all', et une exception qui passe à la
poubelle. *c'est mal*. Il y en a qui vont passer des heures à débugger
ton code, et te maudire quand ils vont tomber là-dessus.




--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"

Avatar
jean-michel bain-cornu
bruno at modulix wrote:
Andréï wrote:
except:



Argh. Une clause except 'catch_all', et une exception qui passe à la
poubelle. *c'est mal*. Il y en a qui vont passer des heures à débugger
ton code, et te maudire quand ils vont tomber là-dessus.
+1



Avatar
Andréï
bruno at modulix wrote:

Andréï wrote:
Salut,
je fait actuellement un petit prog mais je bloque sur probleme:

voici mon code:
#############DEBUT PROG###############
import poplib
class mail(poplib):
def __init__(self,serveur,login,mdp):
self.host = serveur
self.login = login
self.mdp = mdp

def connection(self):
try:
self.POP3(self.host)
self.user(self.login)
self.mdp(self.mdp)


tu es sûr de ton code, là ?

resultat = True
except:


Argh. Une clause except 'catch_all', et une exception qui passe à la
poubelle. *c'est mal*. Il y en a qui vont passer des heures à débugger
ton code, et te maudire quand ils vont tomber là-dessus.


La fonction retourne True s'il n'y a pas eu d'erreur et false s'il y a eu
une erreur. C'est si mal que ca de prévoir ca? C'est a l'utilisateur de la
classe de prévoir la façon dont il veut voir l'erreur traitée.


Avatar
bruno at modulix
Andréï wrote:
bruno at modulix wrote:


Andréï wrote:

(snip)


def connection(self):
try:
self.POP3(self.host)
self.user(self.login)
self.mdp(self.mdp)


tu es sûr de ton code, là ?


resultat = True
except:


Argh. Une clause except 'catch_all', et une exception qui passe à la
poubelle. *c'est mal*. Il y en a qui vont passer des heures à débugger
ton code, et te maudire quand ils vont tomber là-dessus.



La fonction retourne True s'il n'y a pas eu d'erreur et false s'il y a eu
une erreur. C'est si mal que ca de prévoir ca?


Oui. La gestion des erreurs se fait avec les exceptions - qui portent
beaucoup plus d'information qu'un booléen.

C'est a l'utilisateur de la
classe de prévoir la façon dont il veut voir l'erreur traitée.


Justement, tu l'en empêches.

Si tu veux gérer explicitement une erreur, attrape explicitement la (ou
les) classes d'exception que tu gères - et gère les effectivement.
Celles que tu ne gères pas, laisse les se propager.

Sérieusement, tu devrais suivre ce conseil. Dans ton propre intérêt,
d'ailleurs.

Exemple: dans ton code, la troisième instruction dans le bloc try
devrait très vraisemblablement[1] lever un TypeError (je parie sur 'str
object is not callable', allez savoir pourquoi). Et comme tu attrape
cette exception et la passe sous silence, tu vas toi-même passer des
heures à te demander pourquoi la connection échoue toujours[3]...

!-p



[1] à moins bien sûr que le paramètre mdp passé au contructeur ne soit
un callable, mais bon, dans ce cas il serait peut-être temps de se
pencher sur la documentation de ton code[2]

[2] étant bien entendu que la documentation commence par un bon nommage !-)

[3] ... enfin bon, plus maintenant que je t'ai signalé le problème.

--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"



Avatar
Amand Tihon
jean-michel bain-cornu wrote:

bruno at modulix wrote:
Andréï wrote:
except:



Argh. Une clause except 'catch_all', et une exception qui passe à la
poubelle. *c'est mal*. Il y en a qui vont passer des heures à dé bugger
ton code, et te maudire quand ils vont tomber là-dessus.
+1



Je me permets de nuancer. C'est presque toujours mal et dans ce cas-ci, ça
m'a tout l'air de l'être.

Mais il arrive parfois qu'on veuille vraiment tout catcher. Quand un de mes
handlers mod_python (module python pour le serveur web apache) fait une
bêtise, quelle qu'elle soit, l'utilisateur ne doit voir qu'une page
d'erreur générique, et je reçois la pile d'appels dans les logs. Et ça
passe par un 'catch_all', bien évidemment.

Ce type de construction, présent tout en haut de la pile et, j'insist e,
*désactivable* (une variable à True dans la version en développem ent) n'est
que rarement envisageable à un niveau plus bas.

C'était mes deux centimes vespéro-nocturnes.
--
Amand Tihon



Avatar
Bruno Desthuilliers
jean-michel bain-cornu wrote:


bruno at modulix wrote:

Andréï wrote:

except:



Argh. Une clause except 'catch_all', et une exception qui passe à la
poubelle. *c'est mal*. Il y en a qui vont passer des heures à débugger
ton code, et te maudire quand ils vont tomber là-dessus.


+1



Je me permets de nuancer.


Et tu a raison. Comme toutes les règles 'absolutiste' (pas de goto, pas
de retours anticipés, pas d'attributs publics, etc), elle est relative à
la compréhension qu'on a de ce qu'on est en train de faire. Une fois
qu'on a compris la raison de la règle, on sait quand (et comment...) ne
pas l'appliquer.

C'est presque toujours mal et dans ce cas-ci, ça
m'a tout l'air de l'être.


Je confirme !-)

Mais il arrive parfois qu'on veuille vraiment tout catcher. Quand un de mes
handlers mod_python (snip) fait une
bêtise, quelle qu'elle soit, l'utilisateur ne doit voir qu'une page
d'erreur générique, et je reçois la pile d'appels dans les logs. Et ça
passe par un 'catch_all', bien évidemment.


Attention quand même, regarde l'implémentation de sys.exit()

Mettre un catch-all au 'sommet' de l'appli est évidemment une bonne
pratique, ne serait-ce que pour logger, faire le ménage et s'écraser
proprement (mais *pas* silencieusement...) si c'est encore possible.
Mais il faut toujours tester ce qu'on attrape et savoir quoi en faire...
comme par exemple relancer si c'est un SysExit !-)

Ce type de construction, présent tout en haut de la pile


Oui.

et, j'insiste,
*désactivable*


Oui.

n'est
que rarement envisageable à un niveau plus bas.


Oui. Il y a des cas - généralement assez "haut" dans une appli ou une
bibliothèque - où l'on veut tout attraper, par exemple pour s'assurer de
ne laisser passer que certains types d'exception et/ou pour "décorer"
l'exception.

C'était mes deux centimes vespéro-nocturnes.


Bienvenus, et éminemment constructifs.