Partage
  • Partager sur Facebook
  • Partager sur Twitter

Variable globale soit disant non définie

TP : pendu

Anonyme
    30 août 2010 à 13:56:53

    Bonjour;

    Je suis en train de faire un pendu en python et j'ai un petit problème.
    Pour le mot à deviner (guess_word) et le mot affiché (display_word, celui avec seulement les lettres trouvées), j'utilise des variables globales, afin de ne pas les trimbaler dans toutes mes fonctions, seulement l'une d'entre elle (et la plus importante, en fait...), celle qui cherche la lettre dans le mot, me dit que guess_word n'est pas définie.
    J'ai vérifié plusieurs fois et elle l'est bien, je la crée et l'utilise avant l'appel de ma fonction et j'ai bien ajouté le mot-clé global dans la fonction, donc je ne comprends pas.

    Mon code est divisé en trois fichiers, un pour les fonctions, fonctions.py :
    # -*- coding:utf-8 -*-
    
    """ Fonctions du jeu, NE PAS MODIFIER (ou tant pis pour taggle)
    """
    
    from donnees import *
    from random import choice
    import pickle
    
    def word_picker() :
    	return choice(l_words)
    
    def get_profile(plr_name) :
    	f_scores = open("scores", "rb")
    	depickler = pickle.Unpickler(f_scores)
    	try  :
    		d_scores = depickler.load()
    	except EOFError : # Le fichier est vide, donc on y enregistre le dictionnaire des scores
    		f_scores.close()
    		d_scores = {}
    		save_profile()
    		get_profile(plr_name)
    	finally :
    		# Le joueur n'existe pas encore, on crée une entrée pour lui, s'il existe, aucune opération à effectuer
    		if d_scores.get(plr_name, '') == "" :
    			d_scores[plr_name] = 0
    	
    		f_scores.close()
    	return d_scores
    
    def save_profile() :
    	f_scores = open("scores", "wb")
    	pickler = pickle.Pickler(f_scores)
    	try :
    		pickler.dump(d_scores)
    	except :
    		print("\n\t/!\\ Une erreur est survenue lors de la sauvegarde du profil joueur /!\\")
    	finally :
    		f_scores.close()
    
    def compare(letter, start=0) :
    	done = False
    	global guess_word
    	global display_word
    	
    	index = guess_word.find(letter, start)
    	if index != -1 :
    		done = True
    		display_word = display_word[0:index] + letter + display_word[index+1:len(display_word)]
    		compare(letter, index+1)
    	return done
    


    Un autre pour le corps du programme, pendu.py :
    # -*- coding:utf-8 -*-
    
    from fonctions import *
    guess_word = None
    
    print("\n\tOh, hai. Welcum on the Hangman for Begginers v10.08.30.1143 :)")
    print("\n\n Letz start da game, wut iz yur name ? ", end="")
    plr_name = str(input())
    
    d_scores = get_profile(plr_name)
    print("\n Vous avez ", d_scores[plr_name], " points, ", plr_name, ". Bonne chance !", sep="")
    
    again = "o"
    while again == "o":
    	guess_word = word_picker()
    	display_word = ' _ ' * len(guess_word)
    	print("\n\n Le mot a été tiré !", end="")
    	while not display_word.isalpha() or trials > 0 :
    		print(" En", len(guess_word), "lettres :", display_word)
    		print("\n Quelle lettre voulez-vous tenter ? ", end="")
    		letter = str(input()).lower()
    		while len(letter) != 1 or not letter.isalpha() :
    			print(" Vous devez entrer une et une seule lettre. Essayez encore : ", end="")
    			letter = str(input()).lower()
    
    		if compare(letter) :
    			print("\n Bravo, la lettre est juste !")
    		else :
    			trials -= 1
    			print("\n Dommage, un essai en moins, il vous en reste", trials)
    
    	if display_word.isalpha() :
    		d_scores[plr_name] += trials
    		print("\n Bravo, vous avez trouvé le mot ! Votre score est maintenant de", d_scores[plr_name], ".")
    	else :
    		print("\n Dommage, vous n'avez pas trouvé ! Le mot était ", guess_word, ".", sep="")
    
    	print("\n\n Voulez-vous refaire une partie (o/n)? ", end="")
    	again = str(input()).lower()
    
    save_profile()
    


    Et le troisième n'est pas utile ici, il faut juste savoir que les deux variables l_words (dictionnaire du jeu) et trials (nombre d'essais pour le joueur) y sont écrites.

    Et voici l'erreur telle que renvoyée :

    Citation

    Traceback (most recent call last):
    File "/home/guillaume/Python/Pendu/pendu.py", line 26, in <module>
    if compare(letter) :
    File "/home/guillaume/Python/Pendu/fonctions.py", line 45, in compare
    NameError: global name 'guess_word' is not defined



    J'aimerais donc un peu d'aide sur ce coup là, car je sèche, même si c'est peut-être quelque chose d'évident que je n'ai pas vu...

    Merci d'avance et bonne journée :)
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      30 août 2010 à 18:24:49

      pendu.py est un module, il faut l'importer dans ton module fonctions.py

      et les globals en général c'est déconseillé.

      Pour ce que tu fais c'est à dire un pendu, un seul fichier suffit. Si tu maîtrises bien les fonctions, tu peux te mettre aux classes qui vont te permettre d'organiser au mieux ton code.

      Edit: Un petit exemple avec l'utilisation de global, car la tienne est mauvaise

      >>> def test(): a=5
      ... 
      >>> test()
      >>> a
      Traceback (most recent call last):
        File "<stdin>", line 1, in <module>
      NameError: name 'a' is not defined
      >>> def test(): global a; a=5
      ... 
      >>> test()
      >>> a
      5
      >>>
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        30 août 2010 à 18:34:31

        Pour l'utilisation de plusieurs fichiers, c'est simplement parce que c'est demandé dans le tuto.
        Sinon en ce qui concerne l'importation de pendu.py, je suis assez surpris, étant donné que c'est mon fichier principal. Ca vient peut-être du fait que je ne sais pas exactement ce qui se passe lorsqu'on importe un module. Jusqu'à maintenant j'avais dans l'idée que c'était un peu comme une copie du fichier importé dans un autre, et dans ce cas là je ne comprends pas pourquoi je devrais aussi importer le second fichier dans le premier, puisqu'au moment d'utiliser mon fichier importé ma variable globale est déjà connue.
        Ou alors c'est simplement parce que je déclare ma variable globale après l'importation du fichier, même si je l'utilise après...

        PS : j'suis pas sûr d'avoir été bien clair :/
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          30 août 2010 à 18:54:35

          Citation

          Sinon en ce qui concerne l'importation de pendu.py, je suis assez surpris, étant donné que c'est mon fichier principal. Ca vient peut-être du fait que je ne sais pas exactement ce qui se passe lorsqu'on importe un module



          Oui, car en fait ta variable guess_word est initialisé dans ton fichier pendu.py

          Créons un fichier test.py où tu tapes juste a=5

          Ouvre une console et fait ceci :

          import test
          dir(test) # ['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'a']
          print test.a # Résultat :5


          En fait si tu souhaites avoir le nom d'une variable se trouvant dans un module, il faut l'importer, pas d'autres solutions.

          from test import a
          print a # fonctionne aussi
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            30 août 2010 à 19:59:15

            Merci pour l'explication, fred1599.
            J'ai donc rajouté un from pendu import guess_word, display_word, cependant maintenant j'ai eu autre erreur que je n'avais pas avant et qui vient (je pense) du fait que dans pendu.py, j'importe le module fonctions qui lui-même importe pendu, et j'ai donc, lors de l'importation de fonctions, une erreur qui me dit ceci :

            Citation

            Traceback (most recent call last):
            File "/home/guillaume/Python/Pendu/pendu.py", line 3, in <module>
            from fonctions import *
            File "/home/guillaume/Python/Pendu/fonctions.py", line 9, in <module>
            from pendu import guess_word, display_word
            File "/home/guillaume/Python/Pendu/pendu.py", line 10, in <module>
            d_scores = get_profile(plr_name)
            NameError: name 'get_profile' is not defined


            Je pense que c'est parce que dans l'importation de pendu qui est dans fonctions, get_profile n'est pas connu.
            Et là je suis plutôt emmêlé dans toutes ces importations :/
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              30 août 2010 à 20:31:31

              def get_profile(plr_name) :
              	f_scores = open("scores", "rb")
              	depickler = pickle.Unpickler(f_scores)
              	try  :
              		d_scores = depickler.load()
              	except EOFError : # Le fichier est vide, donc on y enregistre le dictionnaire des scores
              		f_scores.close()
              		d_scores = {}
              		save_profile()
              		get_profile(plr_name)
              	finally :
              		# Le joueur n'existe pas encore, on crée une entrée pour lui, s'il existe, aucune opération à effectuer
              		if d_scores.get(plr_name, '') == "" :
              			d_scores[plr_name] = 0
              	
              		f_scores.close()
              	return d_scores
              


              et

              d_scores = get_profile(plr_name)
              


              Tu t'emmêles dans tes variables, si tu ne vois pas le problème, je pense qu'il faut revoir les bases de ton algo, car c'est ambigüe ton code.

              • Partager sur Facebook
              • Partager sur Twitter

              Variable globale soit disant non définie

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown