2010-12-08 10 views
3

J'utilise le framework webapp de Google. Ce que j'essaye de faire ci-dessous est simplement d'envoyer les résultats de query.fetch à une fonction qui prendra les résultats et créera une table avec eux.Fonction Python me disant que j'ai envoyé deux arguments quand j'en ai envoyé un seul

class Utilities(): 
    def create_table(results): 
    #Create a table for the results.... 

variables results obtient deux résultats retour de query.fetch

results = query.fetch(10) #This returns two results 
util = Utilities() 
util.create_table(results) 

Je reçois l'erreur

util.create_table(results) TypeError: create_table() takes exactly 1 argument (2 given)

Je pensais que results obtiendrait automatiquement passé par référence. Ai-je tort?

+2

J'ai ajouté l'indentation puisque nous traitons d'une langue où cela compte. – Davy8

Répondre

9

Le premier argument est défini implicitement par python lorsque la méthode est liée à une instance. Dans ce cas, util. Lors de la définition d'une méthode dans une classe, le premier argument est généralement nommé self et constitue l'objet lié.

class Utilities(): 
    def create_table(self, results): 
     pass # more to come 

devrait fonctionner correctement :)

Edit:
Cela signifie aussi, vous pouvez appeler ces méthodes aussi lorsqu'ils ne sont pas liés à une instance (c.-à-obj.fun()):

utils = Utilities() 
Utilities.create_tables(utils, results) 
+1

Pour clarifier un peu, changez la create_table (résultats) en create_table (self, résultats) – Robert

+1

Je voulais juste dire explicitement que la méthode 'OP 'est actuellement définie, le paramètre' results' est en fait '' self'' avec un autre prénom. C'est en fait une fonction qui prend 0 (externe) paramètres – Davy8

+0

merci, cela a fonctionné:] et merci pour l'information supplémentaire davy – joslinm

1

Le premier argument passé à une méthode est l'instance de la classe. Vous devez en tenir compte lors de la définition.

def create_table(self, results): 
1

Vous devriez lire sur les classes. Une méthode d'un get de classe (auto) envoyé comme premier paramètre.

Modifier à

class Utilities(): 
    def create_table(self, results): 
3

Il devrait être:

def create_table(self, results): 

En effet, l'auto est toujours passé, mais la méthode a besoin de savoir pour le recevoir!

1

Le premier argument de chaque méthode de classe python doit être une instance de la classe elle-même. En tant que convention , self est le mot-clé utilisé pour faire référence à l'instance de classe. Il n'y a aucune raison d'utiliser un mot clé différent et il est fortement déconseillé de suivre la convention self :). Lorsque la méthode de classe est définie, l'argument self doit être inclus. Toutefois, lorsque la méthode de classe est utilisée, l'argument self est implicitement présent.

Exemple:

class C: 
def cMethod(self, a1, a2): 
    pass 
[...] 

>>> cinstance = C() 
>>> cinstance.cMethod(x1, x2) 

Je voulais juste signaler ces deux aspects :). Salut.