Je suis un peu confus quant au fonctionnement des variables globales. J'ai un grand projet, avec environ 50 fichiers, et je dois définir des variables globales pour tous ces fichiers.
Ce que j'ai fait, c'est de les définir dans mon main.py
fichier de projets , comme suit:
# ../myproject/main.py
# Define global myList
global myList
myList = []
# Imports
import subfile
# Do something
subfile.stuff()
print(myList[0])
J'essaie d'utiliser myList
dans subfile.py
, comme suit
# ../myproject/subfile.py
# Save "hey" into myList
def stuff():
globals()["myList"].append("hey")
Une autre façon j'ai essayé, mais ça n'a pas marché non plus
# ../myproject/main.py
# Import globfile
import globfile
# Save myList into globfile
globfile.myList = []
# Import subfile
import subfile
# Do something
subfile.stuff()
print(globfile.myList[0])
Et à l'intérieur subfile.py
j'avais ceci:
# ../myproject/subfile.py
# Import globfile
import globfile
# Save "hey" into myList
def stuff():
globfile.myList.append("hey")
Mais encore une fois, cela n'a pas fonctionné. Comment dois-je mettre cela en œuvre? Je comprends que cela ne peut pas fonctionner comme ça, quand les deux fichiers ne se connaissent pas vraiment (enfin le sous-fichier ne sait pas principal), mais je ne peux pas penser à comment le faire, sans utiliser l'écriture io ou le pickle, qui Je ne veux pas faire.
NameError: name 'myList' is not defined
de lamain.py
ligneprint(globfile.myList[0])
Réponses:
Le problème est que vous avez défini
myList
demain.py
, maissubfile.py
doit l' utiliser. Voici une façon propre de résoudre ce problème: déplacer tous les globaux vers un fichier, j'appelle ce fichiersettings.py
. Ce fichier est chargé de définir les globaux et de les initialiser:Ensuite, vous
subfile
pouvez importer des globaux:Notez que
subfile
cela n'appelle pasinit()
- cette tâche appartient àmain.py
:De cette façon, vous atteignez votre objectif tout en évitant d'initialiser les variables globales plus d'une fois.
la source
init()
. Les modules ne sont évalués que la première fois qu'ils sont importés, il est donc parfaitement correct d'initialiser ces variables dans le corps du module.Voir le document de Python sur le partage de variables globales entre les modules :
la source
x
utilisationfrom config import x
, uniquement en utilisantimport config
Vous pouvez considérer les variables globales Python comme des variables "module" - et en tant que telles, elles sont beaucoup plus utiles que les "variables globales" traditionnelles de C.
Une variable globale est en fait définie dans un module
__dict__
et est accessible depuis l'extérieur de ce module en tant qu'attribut de module.Donc, dans votre exemple:
Et:
la source
En utilisant
from your_file import *
devrait résoudre vos problèmes. Il définit tout pour qu'il soit globalement disponible (à l'exception des variables locales dans les importations bien sûr).par exemple:
et:
la source
import *
à tout prix d'utiliser des références afin que les références soient explicites (et ne prêtent pas à confusion). D'ailleurs, quand avez-vous réellement utilisé toutes les*
références dans un module?La réponse Hai Vu fonctionne très bien, juste un commentaire:
Si vous utilisez le global dans un autre module et que vous souhaitez définir le global de manière dynamique, faites attention à importer les autres modules après avoir défini les variables globales, par exemple:
la source
Votre deuxième tentative fonctionnera parfaitement et est en fait un très bon moyen de gérer les noms de variables que vous souhaitez avoir disponibles globalement. Mais vous avez une erreur de nom dans la dernière ligne. Voici comment cela devrait être:
Voir la dernière ligne? myList est un attr de globfile, pas de sous-fichier. Cela fonctionnera comme vous le souhaitez.
Mike
la source