Использование глобальных переменных между файлами?
Я немного запутался в том, как работают глобальные переменные. У меня большой проект, насчитывающий около 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 defstuff(): 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 defstuff(): globfile.myList.append("hey")
Но опять же, это не сработало. Как я должен это реализовать? Я понимаю, что это не может так работать, когда два файла на самом деле не знают друг друга (ну, subfile не знает main ), но я не могу придумать, как это сделать, без использования ввода-вывода или pickle, чего я не хочу делать.
Переведено автоматически
Ответ 1
Проблема в том, что вы определили myList из main.py, но subfile.py необходимо использовать это. Вот простой способ решить эту проблему: переместить все глобальные переменные в файл, я называю этот файл settings.py. Этот файл отвечает за определение глобальных переменных и их инициализацию:
# settings.py
definit(): global myList myList = []
Далее, ваш subfile может импортировать глобальные переменные:
# subfile.py
import settings
defstuff(): 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
Таким образом, вы достигнете своей цели, избегая при этом инициализации глобальных переменных более одного раза.
Канонический способ обмена информацией между модулями в рамках одной программы заключается в создании специального модуля (часто называемого config или cfg).
config.py:
x = 0# Default value of the 'x' configuration setting
Импортируйте модуль конфигурации во все модули вашего приложения; затем модуль станет доступен как глобальное имя.
main.py:
import config print (config.x)
Как правило, не используйте импорт имя_модуля из *. Это приводит к загромождению пространства имен импортера и значительно усложняет для линтеров обнаружение неопределенных имен.
Ответ 3
Вы можете рассматривать глобальные переменные 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 defstuff(): # 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")
Ответ 4
Использование from your_file import * должно решить ваши проблемы. Он определяет все таким образом, чтобы оно было доступно глобально (за исключением локальных переменных при импорте, конечно).