2010-03-12 2 views
4

Pour une raison quelconque, j'ai de la difficulté à obtenir la tête __init__ et __new__. J'ai un tas de code qui fonctionne bien à partir du terminal, mais quand je le charge comme un plugin pour Google Quick Search Box, j'obtiens l'erreur TypeError: default __new__ takes no parameters.Besoin d'aide pour comprendre "TypeError: défaut __new__ ne prend aucun paramètre" erreur en python

J'ai lu sur l'erreur, et c'est un peu faire tourner mon cerveau. En l'état, j'ai 3 classes, sans sous-classes, chaque classe a son propre def s. Je n'utilise jamais ou def __new__, mais j'ai le sentiment distinct que ce sont les fonctions (ou l'absence de celles-ci) qui me donneraient l'erreur.

Je n'ai aucune idée comment résumer le code jusqu'à un extrait qui serait utile ici, puisque je suis un peu sur ma tête, mais le script entier peut être trouvé au github. Ne m'attendant pas à ce que quelqu'un corrige mon code pour moi, je suis juste à la fin de tout ça. Un simple (anglais simple, pas la citation des docs python que j'ai lu 20 fois et ne comprends toujours pas) expliquant pourquoi cette erreur apparaîtrait, ou pourquoi je devrais être, ou ne pas être, en utilisant le __init__ et/ou __new__ les fonctions seraient sérieusement appréciées.

+0

Salut Gordon. Vous avez vraiment besoin de réduire la question. Le code github n'a même pas __new__, et dépend d'un tas d'importations, et dépend d'une API spéciale, et et et ... Je ne peux même pas dire ce que vous demandez à ce stade. –

Répondre

8

manière la plus simple de reproduire votre problème:

>>> class Bah(object): pass 
... 
>>> x = Bah(23) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in ? 
TypeError: default __new__ takes no parameters 

Il semble qu'il y ait une classe dans votre code (non lorsqu'il est exécuté à partir du terminal, mais alors vous ne les importations très différentes alors) qui n'a pas __init__ défini , et vous êtes quelque part appelant la classe avec quelques paramètres. Dans la trace d'erreur vous devriez obtenir l'endroit où se passe l'appel (sinon, en raison des subtilités de l'interface graphique, vous pouvez utiliser try/except autour de tout et assurez-vous de sauvegarder la traceback dans un fichier/tmp dans la clause except, utilisez module traceback de la bibliothèque standard).

+0

Merci. Il s'avère que Google Quick Search Box appelait 'init', alors qu'il ne l'avait pas été dans les versions précédentes. Désolé ma question n'a pas été formatée trop bien. –

2

Il y a une poignée de concepts de construction de base que vous semblez manquer.

La méthode __init__ est utilisée lorsque la classe init est initialisée, et c'est ainsi que vous configurez ses composants internes. Vous voulez également profiter de new-style classes de Python (la valeur par défaut dans Python 3).

Je suggère de commencer par Dive Into Python et de ramifier à partir de là.

+0

Merci pour l'aide. J'essaie de comprendre toute cette affaire «__init__» vs «__new__», mais il me manque encore quelque chose. Je vais donner un second regard à Dive Into Python. –

Questions connexes