OVH Cloud OVH Cloud

Global, mais à quoi ?

3 réponses
Avatar
Do Re Mi chel La Si Do
Bonsoir !


Considérez le script suivant :

GL=[]

class c(object):
def test(self):
global GL
print len(GL),repr(GL)

def tst():
GL.extend([1,2,3])
a=c()
a.test()

tst()

Ce script fonctionne.



Bon, maintenant, isolons la définition de la classe dans un fichier (par
exemple esslc.py) :
class c(object):
def test(self):
global GL
print len(GL),repr(GL)

puis tentons le script :
GL=[]

def tst():
GL.extend([1,2,3])
import esslc
a=esslc.c()
a.test()

tst()


Et, là, ça plante.

Ça veut dire que "global", c'est global au module contenant la définition de
la classe, et non au module où l'on instancie la classe.


Je me suis tiré d'affaire, en utilisant un module intermédiaire
(module-buffer).

Mais ça me chiffone, qu'une instance de classe se comporte différemment,
selon l'origine de la classe, pour un même code-source.




@-salutations

Michel Claveau



PS-1 : j'ai bien compris qu'en fait, la classe, c'est esslc.c ; je ne
cherche pas une explication ; c'est juste pour troubler les ingrats des
modules (pour faire parler, quoi)

PS-2 : une autre solution, à faire hurler les statiques, serait de remplacer
l'import par :
execfile("esslc.py",globals(),globals())

PS-3 : le PS-2 n'est pas sponsorisé par Sony...

3 réponses

Avatar
Do Re Mi chel La Si Do
Bonsoir !


passer l'objet GL à la classe




Je ne peux pas faire ça. Les appels des méthodes de la classe sont faits,
par COM, depuis d'autres applications, et ne supportent que les paramètres
littéraux. Donc, impossible d'utiliser GL en tant que paramètre.

Bien sûr, je pourrais passer par une chaîne exécutable. Mais ça ne me plaît
pas trop.


@-salutations

Michel Claveau



Avatar
Bruno Desthuilliers
Bonsoir !


Considérez le script suivant :

GL=[]

class c(object):
def test(self):
global GL
print len(GL),repr(GL)

def tst():
GL.extend([1,2,3])
a=c()
a.test()

tst()

Ce script fonctionne.



Bon, maintenant, isolons la définition de la classe dans un fichier (par
exemple esslc.py) :
class c(object):
def test(self):
global GL


Yuck :(

print len(GL),repr(GL)

puis tentons le script :
GL=[]

def tst():
GL.extend([1,2,3])
import esslc
a=esslc.c()
a.test()

tst()


Et, là, ça plante.

Ça veut dire que "global", c'est global au module contenant la définition de
la classe, et non au module où l'on instancie la classe.


Tu viens juste de découvrir ça ?

'global' est l'espace de nommage du module, il n'y a pas d'espace de
nommage réellement global en Python (et c'est une Bonne Chose(tm)).


Je me suis tiré d'affaire, en utilisant un module intermédiaire
(module-buffer).


Il n'y a pas à "s'en tirer", il suffit de faire les choses proprement,
en l'occurrence passer l'objet GL soit à la classe:

# esslc.py

class Machin(object):
def __init__(self, GL):
self.GL = GL
def test(self):
print len(self.GL),repr(self.GL)


soit à la méthode:
class Bidule(object):
def test(self, GL):
print len(GL),repr(GL)

ou soit avec une variation autour d'un de ces thèmes (par exemple en
passant un objet ou une fonction qui renvoie l'objet GL, etc).


Mais ça me chiffone, qu'une instance de classe se comporte différemment,
selon l'origine de la classe, pour un même code-source.


Ton code source *n'est pas* le même. Dans un cas, le nom GL est défini
dans l'espace de nommage du module, dans l'autre il ne l'est pas. Et
justement, c'est ce qui permet au module de ne pas dépendre
*implicitement* d'un symbole extérieur.

Avatar
bruno at modulix
Do Re Mi chel La Si Do wrote:
Bonsoir !



passer l'objet GL à la classe





Je ne peux pas faire ça. Les appels des méthodes de la classe sont faits,
par COM, depuis d'autres applications, et ne supportent que les paramètres
littéraux. Donc, impossible d'utiliser GL en tant que paramètre.


En paramètre d'une méthode, soit, mais qui instancie l'objet ? Sinon, il
y a la globale masquée : le singleton (ou la variante Borg).

Bien sûr, je pourrais passer par une chaîne exécutable. Mais ça ne me plaît
pas trop.


Pour des raisons de sécurité ? Dans ce cas, pourquoi pas un simple
protocole texte ? Enfin, ça dépend bien sûr si c'est un script jetable
ou une partie critique d'une application !-)

Bon, c'est difficile de juger hors contexte, et il m'arrive aussi de
devoir me résoudre à de vilaines verrues, mais franchement, une méthode
qui dépend d'une globale 'externe', ça heurte mon sens esthétique.


--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"