Использование глобальных переменных между файлами?
Я немного смущен тем, как работают глобальные переменные. У меня есть большой проект, около 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")
но опять же, это не сработало. Как мне это реализовать? Я понимаю, что это не может работать так, когда два файла действительно не знают друг друга (ну, подфайл не знает main), но я не могу придумать, как это сделать, не используя запись io или рассол, чего я не хочу делать.
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')
обратите внимание, что подфайл не вызывает 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 или ГПФ).
config.py:
x = 0 # Default value of the 'x' configuration setting
импортируйте модуль config во все модули вашего приложения; затем модуль становится доступным как глобальное имя.
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 globfile, а не subfile. Это будет работать как вы хотите.
Майк