L'utilisation de variables globales entre les fichiers?
Je suis peu confus sur la façon dont les variables globales de travail. J'ai un grand projet, avec près de 50 fichiers, et j'ai besoin de définir des variables globales pour tous les fichiers.
Ce que j'ai fait a été de définir dans mes projets main.py
fichier, comme suit:
# ../myproject/main.py
# Define global myList
global myList
myList = []
# Imports
import subfile
# Do something
subfile.stuff()
print(myList[0])
Je suis en train 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 ne fonctionne pas 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 de subfile.py
j'ai eu 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 devrais-je mettre en œuvre cette? Je comprends que cela ne fonctionne pas comme ça, quand les deux fichiers ne sais pas vraiment les uns des autres (bien subfile ne sais pas le principal), mais je ne peux pas penser comment le faire, sans l'aide de io écrit ou cornichon, dont je n'ai pas envie de faire.
- En fait, votre deuxième approche fonctionne bien pour moi. main.py imprime correctement "hé". Pouvez-vous être plus précis sur ce que vous m'par "ça ne marche pas"?
- l'importation de cycles - le code de la sous-fichier essaie d'importer des globfile, qui en itś corps importations de lui-même de retour
NameError: name 'myList' is not defined
demain.py
ligneprint(globfile.myList[0])
Vous devez vous connecter pour publier un commentaire.
Le problème, c'est que vous avez défini
myList
demain.py
, maissubfile.py
besoins de l'utiliser. Voici une méthode propre pour résoudre ce problème: déplacer toutes les variables globales dans un fichier, j'ai appeler ce fichiersettings.py
. Ce fichier est chargé de la définition des variables globales et de l'initialisation d'eux:Ensuite, votre
subfile
pouvez importer globals:Noter que
subfile
n'appelle pasinit()
— cette tâche appartient àmain.py
:De cette façon, vous atteindre votre objectif, éviter l'initialisation des variables globales plus d'une fois.
init()
choses. Les Modules sont évalués uniquement la première fois qu'ils sont importés, de sorte qu'il est parfaitement OK pour initialiser ces variables dans le corps du module.Voir Python document sur le partage de variables globales entre les modules:
x
à l'aide defrom config import x
, en utilisant uniquementimport config
Vous pouvez penser de Python variables globales en tant que "module" variables - et en tant que tels, ils sont bien plus utiles que le traditionnel "variables globales" de C.
Une variable globale est en fait défini dans un module
__dict__
et peut être accessible depuis l'extérieur de ce module comme module attribut.Donc, dans votre exemple:
Et:
À l'aide de
from your_file import *
devrait résoudre votre problèmes. Il définit tout de sorte qu'il est disponible dans le monde entier (à l'exception des variables locales dans les importations de cours).par exemple:
et:
import *
à tout prix, de sorte que les références sont explicites (et ne prête pas à confusion), d'Ailleurs, si jamais vous avez effectivement utilisé tous les "*
" références dans n'importe quel module?Hai Vu répondre fonctionne très bien, juste un commentaire:
Dans le cas où vous utilisez le mondial dans un autre module et vous souhaitez créer le mondial, de manière dynamique, faites attention à importer les autres modules après avoir défini les variables globales, par exemple:
Votre 2ème tentative fonctionne parfaitement, et est effectivement une très bonne façon de gérer les noms de variables que vous souhaitez avoir à disposition à l'échelle mondiale. Mais vous avez une erreur de nom dans la dernière ligne. Voici comment il devrait être:
Voir la dernière ligne? myList est un attribut de globfile, pas de sous-fichier. Cela fonctionne comme vous le souhaitez.
Mike