Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Accès aux variables globales dans classes en Python

+1 vote

Bonjour,
Je suis sous WIndows 7, 64bits, Python 2.7.10 32bits (pas le choix).

Je crée fichier definitions.py contenant la déclaration d'une classe :

class Essai():
    def __init__(self):
        self.sortie = None
    def calculs(self):
        self.sortie = variable[0]+variable[1]
    def affichage(self):
        print self.sortie

Je crée le fichier de calculs suivant :

from myclasses import definitions

variable = [1,2]

instance = definitions.Essai()

instance.calculs()
instance.affichage()

Qui me renvoie

  File "xxx\definitions.py", line 5, in calculs
    self.sortie = variable[0]+variable[1]
NameError: global name 'variable' is not defined

La question est simple : comment déclarer variable comme une variable globale, pour que Essai puisse en connaitre la valeur ? Je sais qu'il faut mieux éviter les variables globales en python, mais dans mon cas je ne fais pas de modification, simplement de l'accés. La plupart des posts sur les forums d'aide ne concerne que le cas où l'on veut modifier variable. Dans ce cas, bien sûr, déclarer variable dans les attributs de Essai fonctionne.

Bien sûr, mon code est bien plus complexe mais ce court exemple simplifie les choses.
Si possible, je souhaiterai également accéder à logger, un objet comme défini sur l'article du blog correspondant.
Merci à tous !

demandé 18-Avr par MaxL

2 Réponses

+3 votes

En fait c'est plutôt facile comme problématique, il suffit de créer un module avec toutes tes constantes.

# constants.py

VARIABLE = [1, 2]


# definitions.py

from . import constants  # ou: from constants import VARIABLE

class Essai():
    def __init__(self):
        self.sortie = None
    def calculs(self):
        self.sortie = constants.VARIABLE[0] + constants.VARIABLE[1]
    def affichage(self):
        print self.sortie


# __init__.py

from . import definitions

instance = definitions.Essai()
instance.calculs()
instance.affichage()
répondu 18-Avr par debnet (990 points)
+1 vote

Pourquoi ne pas passer simplement ta variable en argument de calculs?
Un truc du style:

class Essai(object):
  def __init__(self):
    self.sortie = None

  def calculs(self, *args):
    self.sortie = sum(*args)

instance = Essai()
instance.calculs([1, 2])
print(instance.sortie)
répondu 20-Avr par vmonte (196 points)
...