2010-08-23 2 views
1

J'ai une classe python et dans la classe j'appelle 2 méthodes différentes de l'une des autres méthodes. On travaille et on me donne un TypeError: get_doms() prend exactement 1 argument (2 donné):comment appeler des méthodes dans une classe en python - Problème TypeError

def start(self,cursor): 
    recs = self.get_recs(cursor) # No errors here 
    doms = self.get_doms(cursor) # I get a TypeError here 




    def get_doms(self,cursor): 
    cursor.execute("select domain from domains") 
    doms = [] 
    for i in cursor._rows: 
     doms.append(i[0]) 
    return doms 

    def get_recs(self,cursor): 
    cursor.execute("select * from records") 
    recs = [] 
    print cursor._rows 
    recs = [list(i) for i in cursor._rows] 
    return recs 

Comment appeler avec succès les méthodes dans ma classe d'autres méthodes dans la même classe? Pourquoi travaille-t-on et pas l'autre? ~~ thanks ~~

+2

Vérifiez que vous n'avez pas 'get_doms' redéfini quelque part –

+1

un retraçage serait utile – msw

Répondre

0

Je ne peux pas reproduire l'erreur que vous mentionnez. Je pense que le code est correct. Mais je suggère ne pas utiliser cursor._rows parce que l'attribut _rows est un attribut privé. Les attributs privés sont un détail d'implémentation - ils ne sont pas garantis d'être présents dans les futures versions de cursor. Vous pouvez obtenir ce que vous voulez sans, puisque cursor lui-même est un itérateur:

def start(self,cursor): 
    recs = self.get_recs(cursor) 
    doms = self.get_doms(cursor) 
    print(recs) 
    print(doms) 
def get_doms(self,cursor): 
    cursor.execute("select domain from domains") 
    doms = [row[0] for row in cursor] 
    return doms 

def get_recs(self,cursor): 
    cursor.execute("select * from records") 
    recs=[list(row) for row in cursor] 
    return recs 
+0

merci ~ ubuntu, j'ai changé mon code en fonction de vos conseils. Je ne suis pas sûr de ce que j'ai fait mais je ne reçois plus le TypeError et mon code semble fonctionner comme souhaité. – Craig

0

Comme gnibbler dit, vous avez probablement singe-patch la méthode get_doms quelque part et le remplacer par une fonction normale, au lieu d'une méthode liée (méthode est liée, c'est-à-dire qu'elle enregistre sa variable self, lorsqu'elle est définie dans une classe et que vous y accédez dans un objet). Vous devez appliquer une méthode monkey-patch sur la classe, pas sur l'objet, ou utiliser une fermeture pour émuler la liaison, comme dans js.

+0

> utilisez une fermeture pour émuler la liaison - vous pouvez lier n'importe quelle méthode à n'importe quel objet en utilisant types.MethodType, il n'y a pas besoin de fermetures. –

Questions connexes