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


Я немного запутался в том, как работают глобальные переменные. У меня есть большой проект, около 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 116

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

Майк