3 votes

Arguments de mots-clés Python dans les méthodes de classe

J'essaie d'écrire une méthode de classe qui prend 3 arguments de mots-clés. J'ai déjà utilisé des arguments de mots-clés auparavant, mais je n'arrive pas à les faire fonctionner dans ma classe. Le code suivant :

def gamesplayed(self, team = None, startyear = self._firstseason,
                endyear = self._lastseason):

    totalGames = 0

    for i in self._seasons:
        if((i.getTeam() == team or team == "null") and
           i.getYear() >= startyear and i.getYear() <= endyear):

            totalGames += i .getGames()

    return totalGames

produit l'erreur :

NameError : le nom 'self' n'est pas défini

Si je supprime les arguments de type mot-clé et que je les transforme en simples arguments de type positionnel, cela fonctionne bien. Je ne sais donc pas où se situe mon problème. Merci d'avance pour toute aide.

8voto

poke Points 64398
def gamesplayed(self, team = None, startyear = self._firstseason, endyear = self._lastseason):

Dans la déclaration de la fonction, vous essayez de faire référence à des variables d'instance en utilisant la fonction self . Toutefois, cela ne fonctionne pas car self est juste un nom de variable pour le premier argument de la fonction qui reçoit une référence à l'instance courante passée. En tant que tel, self n'est surtout pas un mot clé qui pointe toujours vers l'instance courante (contrairement à this dans d'autres langues). Cela signifie également que la variable n'est pas encore définie lors de la déclaration de la fonction.

Ce que vous devriez faire, c'est de simplement prédéfinir ces paramètres avec None et les prérégler à ces valeurs dans ce cas à l'intérieur du corps de la fonction. Cela permet également aux utilisateurs d'analyser une valeur vers la méthode qui donne les valeurs par défaut sans avoir à accéder aux valeurs à partir de votre classe.

2voto

mvanveen Points 2067

Les valeurs par défaut des arguments des mots-clés sont liées au moment de la construction du module, et non au moment de la construction de l'instance de classe. C'est pourquoi self n'est pas définie dans ce contexte.

Le même fait concernant les valeurs par défaut peut créer toutes sortes de problèmes chaque fois que vous voulez un argument de mot-clé où la valeur par défaut se met à jour chaque fois que la fonction est appelée. Lorsque vous exécuterez le programme, vous constaterez que la valeur par défaut que vous vous attendez à voir mise à jour est toujours fixée à la valeur construite lors de la première initialisation du module.

Je conseille d'utiliser None comme paramètre de mot-clé par défaut dans les deux cas, car poke et d'autres l'ont suggéré. Votre code pourrait ressembler à quelque chose comme :

def gamesplayed(self, team=None, startyear=None, endyear=None):
    if not startyear:
        startyear = self._firstseason
    if not endyear:
        endyear = self._lastseason

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X