Использование глобальных переменных между файлами?
Я немного запутался в том, как работают глобальные переменные. У меня есть большой проект, около 50 файлов, и мне нужно определить глобальные переменные для всех этих файлов.
что я сделал, так это определил их в своих проектах main.py
файл, как показано ниже:
# ../myproject/main.py
# Define global myList
global myList
myList = []
# Imports
import subfile
# Do something
subfile.stuff()
print(myList[0])
Я пытаюсь использовать myList
на subfile.py
, а после
# ../myproject/subfile.py
# Save "hey" into myList
def stuff():
globals()["myList"].append("hey")
другой способ я пробовал, но не работает
# ../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])
и внутри subfile.py
у меня был это:
# ../myproject/subfile.py
# Import globfile
import globfile
# Save "hey" into myList
def stuff():
globfile.myList.append("hey")
но опять же, это не сработало. Как я должен это реализовать? Я понимаю, что это не может работать так, когда два файла действительно не знают друг друга (ну, subfile не знает main), но я не могу думать о том, как это сделать, не используя IO writing или pickle, что я не хочу делать.
6 ответов:
проблема в том, что вы определили
myList
от main.py но ... subfile.py нужно его использовать. Вот чистый способ решить эту проблему: переместите все глобалы в файл, я называю этот файлsettings.py
. Этот файл отвечает за определение глобалов и их инициализацию:# settings.py def init(): global myList myList = []
далее, ваш субфайл может импортировать глобалы:
# subfile.py import settings def stuff(): settings.myList.append('hey')
обратите внимание, что subfile не вызывает init () -- эта задача принадлежит main.py:
# main.py import settings import subfile settings.init() # Call only once subfile.stuff() # Do stuff with global var print settings.myList[0] # Check the result
таким образом, вы достигаете своей цели в то время как избегайте инициализации глобальных переменных более одного раза.
вы можете думать о глобальных переменных Python как о переменных "модуля" - и как таковые они гораздо более полезны, чем традиционные" глобальные переменные " из C.
глобальная переменная фактически определяется в модуле
__dict__
и могут быть доступны из-за пределов этого модуля в качестве атрибута модуля.Так, в вашем примере:
# ../myproject/main.py # Define global myList # global myList - there is no "global" declaration at module level. Just inside # function and methods myList = [] # Imports import subfile # Do something subfile.stuff() print(myList[0])
и:
# ../myproject/subfile.py # Save "hey" into myList def stuff(): # You have to make the module main available for the # code here. # Placing the import inside the function body will # usually avoid import cycles - # unless you happen to call this function from # either main or subfile's body (i.e. not from inside a function or method) import main main.mylist.append("hey")
см. документ Python на совместное использование глобальных переменных через модули:
канонический способ обмена информацией между модулями в рамках одной программы заключается в создании специального модуля (часто называемого config или cfg).
config.py:
x = 0 # Default value of the 'x' configuration setting
импортируйте модуль конфигурации во все модули вашего приложения; затем модуль становится доступным как глобальное имя.
main.py:
import config print config.x
или
from config import x print x
В общем, не используйте С импортировать модуль *. Это приводит к загромождению пространства имен импортера и значительно затрудняет обнаружение линтерами неопределенных имен.
используя
from your_file import *
должно исправить ваши проблемы. Он определяет все так, чтобы он был глобально доступен (за исключением локальных переменных в импорте, конечно).например:
##test.py: from pytest import * print hello_world
и:
##pytest.py hello_world="hello world!"
Hai Vu ответ Отлично работает, только один комментарий:
Если вы используете глобальный в другом модуле и хотите установить глобальный динамически, обратите внимание на импорт других модулей после установки глобальных переменных, например:
# settings.py def init(arg): global myList myList = [] mylist.append(arg) # subfile.py import settings def print(): settings.myList[0] # main.py import settings settings.init("1st") # global init before used in other imported modules # Or else they will be undefined import subfile subfile.print() # global usage
ваша 2-я попытка будет работать отлично, и на самом деле это действительно хороший способ обработки имен переменных, которые вы хотите иметь доступны во всем мире. Но у вас есть ошибка имени в последней строке. Вот как это должно быть:
# ../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])
видите последнюю строку? myList-это attr глобфайла, а не субфайла. Это будет работать так, как вы хотите.
Майк