Использование глобальных переменных между файлами?

Я немного смущен тем, как работают глобальные переменные. У меня большой проект с примерно 50 файлами, и мне нужно определить глобальные переменные для всех этих файлов.

То, что я сделал, это определить их в файле main.py моего проекта, как main.py ниже:

 # ../myproject/main.py # Define global myList global myList myList = [] # Imports import subfile # Do something subfile.stuff() print(myList[0]) 

Я пытаюсь использовать myList в subfile.py , как 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") 

Но опять же, это не сработало. Как мне это реализовать? Я понимаю, что он не может работать так, когда эти два файла действительно не знают друг друга (нужный подфайл не знает основную информацию), но я не могу придумать, как это сделать, без использования io письма или рассола, который Я не хочу этого делать.

6 Solutions collect form web for “Использование глобальных переменных между файлами?”

Проблема в том, что вы определили myList из main.py, но subfile.py необходимо использовать его. Вот простой способ решить эту проблему: переместите все глобалы в файл, я вызываю этот файл settings.py . Этот файл отвечает за определение глобальных переменных и их инициализацию:

 # settings.py def init(): global myList myList = [] 

Затем ваш подфайл может импортировать глобальные переменные:

 # subfile.py import settings def stuff(): settings.myList.append('hey') 

Обратите внимание, что подфайл не вызывает 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 

Таким образом, вы достигаете своей цели, избегая при этом инициализации глобальных переменных более одного раза.

Использование from your_file import * должно исправить ваши проблемы. Он определяет все так, чтобы он был доступен на глобальном уровне (за исключением, конечно, локальных переменных в импорте).

например:

 ##test.py: from pytest import * print hello_world 

а также:

 ##pytest.py hello_world="hello world!" 

Вы можете думать о глобальных переменных 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 (ie not from inside a function or method) import main main.mylist.append("hey") 

Ответ на 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 

См. Документ Python по обмену глобальными переменными между модулями:

Канонический способ обмена информацией между модулями в рамках одной программы – создать специальный модуль (часто называемый config или cfg).

config.py:

 x = 0 

Импортируйте конфигурационный модуль во все модули вашего приложения; модуль становится доступным как глобальное имя.

main.py:

 import config print (config.x) 

или

 from config import x print (x) 

В общем, не используйте из modulename import * . Это препятствует пространству имен импортера и значительно затрудняет обнаружение неопределенных имен.

Ваша вторая попытка будет работать отлично и на самом деле является действительно хорошим способом обработки имен переменных, которые вы хотите получить глобально. Но у вас есть ошибка имени в последней строке. Вот как это должно быть:

 # ../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 файла globfile, а не подфайла. Это будет работать так, как вы хотите.

Майк

 
Interesting Posts for Van-Lav

Каков максимальный размер пакета, который может обрабатывать сокет python?

Как я могу распараллелить вызовы методов в массиве объектов?

Есть ли библиотека Python, которая содержит список всех символов ascii?

Как читать файлы UTF-8 с помощью Pandas?

объект «супер», не вызывающий __getattr__

Проблемы с округлением десятичных разрядов (python)

Как изменить wagtail CMS, чтобы любой пользователь мог публиковать сообщения в блоге в своем собственном блоге

Самый простой способ запрограммировать виртуальную файловую систему в Windows с Python

Удаление нескольких столбцов в Pandas

Повторяющийся код в тестовом файле unittest

Как пропустить столбцы в Python?

Как я могу тестировать Django Views?

Пользовательский фильтр jinja2 для итератора

Быстрая двухмерная интерполяция в Python с регулярной сеткой SciPy для разброса / нерегулярной оценки

Вычислительный продукт i-й строки массива1 и i-й столбец array2 – NumPy

Python - лучший язык программирования в мире.