Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

SyntaxWarning : name is assigned to before global declaration

3 réponses
Avatar
Monsieur Dusnob
Bonjour

je débute en python alors désolé si ma question est un peu stupide.

J'ai écrit un programme (en fait une interface graphique pour un
ensemble de classes situé dans un autre module) qui doit gérer
(lire/transformer/écrire) une (et une seule) instance d'une classe
"service".

Comme corps du programme, j'ai :

if __name__=="__main__":
serviceencours=None
creeinterface()
tk.mainloop()

ici, serviceencours est modifié à l'intérieur de (une fonction appelée
par) creeinterface() (je passe les détails non relevants, et le
word-wrapping est "accidentel") :

def creeinterface():
rafraichirapercu()

def rafraichirapercu():
global serviceencours
try:
serviceencours=idef.service(sourceentry.get())
except:
serviceencours=None
if sourceentry.get()!="":
tkMessageBox.showerror("Erreur",'Impossible d\'interpréter
le fichier "%s".\nEst-il au bon format ?' % sourceentry.get(),parent=root)


À l'exécution, tout marche bien, excepté que j'ai ce message sur sdterr :
SyntaxWarning: name 'serviceencours' is assigned to before global
declaration
def rafraichirapercu():

J'ai un peu de mal à comprendre ce qui chiffone Python (ce comportement
est voulu) et surtout que faire pour y remédier. Est-ce que j'ai fait
quelque chose de mal ?

Merci pour vos lumières...

Frédéric.

3 réponses

Avatar
Fouff
Bonjour

je débute en python alors désolé si ma question est un peu stupide.

J'ai écrit un programme (en fait une interface graphique pour un
ensemble de classes situé dans un autre module) qui doit gérer
(lire/transformer/écrire) une (et une seule) instance d'une classe
"service".

Comme corps du programme, j'ai :

if __name__=="__main__":
serviceencours=None
creeinterface()
tk.mainloop()

ici, serviceencours est modifié à l'intérieur de (une fonction appelée
par) creeinterface() (je passe les détails non relevants, et le
word-wrapping est "accidentel") :

def creeinterface():
rafraichirapercu()

def rafraichirapercu():
global serviceencours
try:
serviceencours=idef.service(sourceentry.get())
except:
serviceencours=None
if sourceentry.get()!="":
tkMessageBox.showerror("Erreur",'Impossible d'interpréter
le fichier "%s".nEst-il au bon format ?' % sourceentry.get(),parent=root)


À l'exécution, tout marche bien, excepté que j'ai ce message sur sdterr :
SyntaxWarning: name 'serviceencours' is assigned to before global
declaration
def rafraichirapercu():

J'ai un peu de mal à comprendre ce qui chiffone Python (ce comportement
est voulu) et surtout que faire pour y remédier. Est-ce que j'ai fait
quelque chose de mal ?

Merci pour vos lumières...

Frédéric.
Salut à toi.


Tu dois déclarer ta variable globale et l'initialiser avant ton
if __name__=="__main__":


ce qui donne :
serviceencours = None
if __name__=="__main__":
serviceencours=None
creeinterface()
tk.mainloop()


Tu pouras ainsi t'en servir partout où tu l'aura "importée" avec le mot "global", comme dans la
fonction :
def rafraichirapercu():
global serviceencours
...



Bon courage ;)

Avatar
Monsieur Dusnob
Salut


Salut à toi.

Tu dois déclarer ta variable globale et l'initialiser avant ton
if __name__=="__main__":

ce qui donne :
serviceencours = None
if __name__=="__main__":
serviceencours=None
creeinterface()
tk.mainloop()



Merci pour ta réponse.

J'ai fait ça mais ça me donne exactement le même syntax warning. J'ai
même essayé de rajouter un "global serviceencours" juste avant
l'initialisation à None, mais ça ne change rien (ce qui est normal à mon
avis, puisque global n'a de sens que dans une fonction).

Ce qui me gêne le plus, c'est de ne pas comprendre ce qui gêne python.
C'est grave, dans une fonction, de déclarer qu'une variable est globale
alors qu'elle possède déjà une valeur ?

Frédéric


Avatar
Monsieur Dusnob
Oups... Désolé, le problème est résolu.

Suite à de nombreuses modifications, il restait un deuxième "global
serviceencours" qui traînait dans le corps de la fonction
rafraichirapercu().

J'ai viré cette seconde occurrence et tout est rentré dans l'ordre.

Désolé du dérangement...

Frédéric