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

Я немного озадачен тем, как работают глобальные переменные. У меня большой проект, около 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")

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

 user163286123 окт. 2012 г., 18:38
NameError: name 'myList' is not defined изmain.py линияprint(globfile.myList[0])
 jsbueno23 окт. 2012 г., 18:21
@rodion: импорт циклов - код в подфайле пытается импортировать глобальный файл, который в нем… тело импортирует обратно
 rodion23 окт. 2012 г., 18:01
На самом деле, ваш второй подход прекрасно работает для меня. main.py правильно печатает "эй". Можете ли вы быть более конкретным на то, что вы мне "не работает"?

Ответы на вопрос(6)

Решение Вопроса

Проблема в том, что вы определили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

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

 Kirk Strauser23 окт. 2012 г., 19:10
Мне нравится общий подход, но не весьinit() вещи. Модули оцениваются только при первом импорте, поэтому вполне нормально инициализировать эти переменные в теле модуля.
 twasbrillig27 янв. 2015 г., 21:29
Вы должны называть это чем-то другим, кроме глобалов, что является встроенным именем. PyLint выдает предупреждение: «Переопределение встроенных глобалов (redefined-builtin)»
 Hai Vu20 авг. 2015 г., 14:10
@FranckDernoncourt Извините, я не использую Eclipse, поэтому я еще более невежествен, чем вы.
 Hai Vu23 окт. 2012 г., 22:52
+1 Кирк: я согласен. Однако мой подход предотвращает случай, когда другие модули модифицируют globals.myList до запуска основной программы.
 Franck Dernoncourt20 авг. 2015 г., 09:08
Благодарю. Любая идея, как удалить ошибки «Неопределенная переменная из импорта», которые появляются в Eclipse PyDev, используя эту файловую структуру (то есть импорт глобальных переменных из settings.py)? Мне пришлосьотключить ошибку в PyDev, что не идеально.

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

например:

##test.py:

from pytest import *

print hello_world

а также:

##pytest.py

hello_world="hello world!"
 ThorSummoner18 сент. 2014 г., 22:30
Я лично избегаю использованияimport * любой ценой, чтобы ссылки были явными (и не сбивающими с толку), кроме того, когда вы когда-либо фактически использовали все "*ссылки в любом модуле?
 Isa Hassen07 февр. 2016 г., 15:11
НЕ ДЕЛАЙТЕ импорт *. Ваши глобальные переменные больше не будут синхронизироваться. Каждый модуль получает свою собственную копию. Изменение переменной в одном файле не отразится на другом. Он также предупрежден противdocs.python.org/2/faq/...
 jsbueno23 окт. 2012 г., 18:03
За исключением случаев, когда вы назначаете одну такую переменную

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

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

Майк

менных - и поэтому они гораздо более полезны, чем традиционные «глобальные переменные» из 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")
 Nikhil VJ24 авг. 2018 г., 06:11
вау, обычно можно ожидать, что два импортирующих друг друга файла попадут в бесконечный цикл.

Если вы используете глобальный модуль в другом модуле и хотите установить глобальный динамически, обратите внимание на импорт других модулей после установки глобальных переменных, например:

# 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

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

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

Это также позволит вамустановлен такая переменнаядинамично:

import config
config.x = my_function

В общем,не использовать изимпорт по модулю *, Это приводит к загромождению пространства имен импортера и затрудняет для линтеров обнаружение неопределенных имен.

 JoeyC23 янв. 2019 г., 01:48
Это похоже на более чистый подход, чем принятый ответ.
 toonarmycaptain08 нояб. 2018 г., 05:42
Спасатель - только по этой ссылке!

Ваш ответ на вопрос