Estou um pouco confuso sobre como as variáveis globais funcionam. Eu tenho um projeto grande, com cerca de 50 arquivos, e preciso definir variáveis globais para todos esses arquivos.
O que fiz foi defini-los no meu main.py
arquivo de projetos , da seguinte maneira:
# ../myproject/main.py
# Define global myList
global myList
myList = []
# Imports
import subfile
# Do something
subfile.stuff()
print(myList[0])
Eu estou tentando usar myList
em subfile.py
, como a seguir
# ../myproject/subfile.py
# Save "hey" into myList
def stuff():
globals()["myList"].append("hey")
Por outro lado, tentei, mas também não funcionou
# ../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])
E por dentro subfile.py
eu tinha isso:
# ../myproject/subfile.py
# Import globfile
import globfile
# Save "hey" into myList
def stuff():
globfile.myList.append("hey")
Mas, novamente, não funcionou. Como devo implementar isso? Entendo que não pode funcionar assim, quando os dois arquivos não se conhecem (o subarquivo não conhece main), mas não consigo pensar em como fazê-lo, sem usar io writing ou pickle, o que Eu não quero fazer
NameError: name 'myList' is not defined
frommain.py
lineprint(globfile.myList[0])
Respostas:
O problema é que você definido
myList
a partirmain.py
, massubfile.py
precisa usá-lo. Aqui está uma maneira limpa de resolver esse problema: mova todos os globais para um arquivo, eu chamo esse arquivosettings.py
. Este arquivo é responsável por definir globais e inicializá-los:Em seguida, você
subfile
pode importar globais:Observe que
subfile
não chamainit()
- essa tarefa pertence amain.py
:Dessa forma, você alcança seu objetivo e evita inicializar variáveis globais mais de uma vez.
fonte
init()
tudo. Os módulos são avaliados apenas na primeira vez que são importados, portanto, é perfeitamente bom inicializar essas variáveis no corpo do módulo.Veja o documento do Python sobre o compartilhamento de variáveis globais entre módulos :
fonte
x
usandofrom config import x
, apenas usandoimport config
Você pode pensar nas variáveis globais do Python como variáveis de "módulo" - e, como tal, são muito mais úteis que as tradicionais "variáveis globais" de C.
Uma variável global é realmente definida nos módulos
__dict__
e pode ser acessada de fora desse módulo como um atributo do módulo.Então, no seu exemplo:
E:
fonte
Usando
from your_file import *
deve corrigir seus problemas. Ele define tudo para que esteja disponível globalmente (com exceção das variáveis locais nas importações, é claro).por exemplo:
e:
fonte
import *
a todo custo, para que as referências sejam explícitas (e não confusas). Além disso, quando você "*
" usou todas as referências em algum módulo?A resposta Hai Vu funciona muito bem, apenas um comentário:
Caso você esteja usando o global em outro módulo e deseje configurá-lo dinamicamente, preste atenção para importar os outros módulos depois de definir as variáveis globais, por exemplo:
fonte
Sua segunda tentativa funcionará perfeitamente e é realmente uma boa maneira de lidar com nomes de variáveis que você deseja disponibilizar globalmente. Mas você tem um erro de nome na última linha. Aqui está como deve ser:
Veja a última linha? myList é um atributo de globfile, não subarquivo. Isso funcionará como você deseja.
Mike
fonte