Вопрос-Ответ

Using global variables between files?

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

Я немного запутался в том, как работают глобальные переменные. У меня большой проект, насчитывающий около 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 ), но я не могу придумать, как это сделать, без использования ввода-вывода или pickle, чего я не хочу делать.

Переведено автоматически
Ответ 1

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

# settings.py

def init():
global myList
myList = []

Далее, ваш subfile может импортировать глобальные переменные:

# 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

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

Ответ 2

Смотрите документ Python о совместном использовании глобальных переменных между модулями:


Канонический способ обмена информацией между модулями в рамках одной программы заключается в создании специального модуля (часто называемого 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
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")
Ответ 4

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

например:

##test.py:

from pytest import *

print hello_world

и:

##pytest.py

hello_world="hello world!"
python