Подтвердить что ты не робот

Глобальная переменная из другого файла Python

Итак, у меня есть два разных файла, несколько похожий на это:

file1.py

from file2 import *
foo = "bar";
test = SomeClass();

file2.py

class SomeClass :
    def __init__ (self):
        global foo;
        print foo;

Однако я не могу заставить file2 распознавать переменные из файла1, даже если он уже импортирован в файл1. Было бы очень полезно, если это возможно в некотором роде.

4b9b3361

Ответ 1

Импортирование file2 в file1.py делает глобальные (то есть уровни модуля) именами, привязанными к file2 доступными для следующего кода в file1 - единственное такое имя SomeClass. Он не делает обратное: имена, определенные в file1, не доступны для кода в file2, когда file1 импортирует file2. Это было бы так, даже если вы импортировали правильный путь (import file2, как правильно рекомендует @nate), а не ужасным, ужасным способом, которым вы это делаете (если все под солнцем забывают о существовании конструкции from ... import *, жизнь была бы намного лучше для всех).

По-видимому, вы хотите сделать глобальные имена, определенные в file1 доступными для кода в file2 и наоборот. Это называется "циклической зависимостью" и является ужасной идеей (в Python или где-то еще в этом отношении).

Таким образом, вместо того, чтобы показывать вам невероятно хрупкие, часто недостижимые хаки для достижения (некоторого подобия) циклической зависимости в Python, я бы скорее обсудил много отличных способов, которыми вы можете избегать такая страшная структура.

Например, вы можете поместить глобальные имена, которые должны быть доступны для обоих модулей в третьем модуле (например, file3.py, чтобы продолжить последовательность имен;-) и импортировать этот третий модуль в каждый из двух других (import file3 в file1 и file2, а затем используйте file3.foo и т.д., то есть квалифицированные имена, для доступа или установки этих глобальных имен из одного или обоих других модулей, не barenames).

Конечно, все больше и больше конкретной помощи можно было бы предложить, если бы вы разъяснили (отредактировав свой Q) именно то, почему вы считаете, что вам нужна циклическая зависимость (просто одно простое предсказание: независимо от того, что заставляет вас думать, что вам нужна циклическая зависимость, вы ошибаетесь, -).

Ответ 2

from file2 import * создает копии. Вы хотите сделать это:

import file2
print file2.foo
print file2.SomeClass()

Ответ 3

Когда вы пишете

from file2 import *

он фактически копирует имена, определенные в file2, в пространство имен file1. Поэтому, если вы переназначите эти имена в file1, написав

foo = "bar"

например, это сделает только это изменение в file1, а не file2. Обратите внимание, что если вы должны были изменить атрибут foo, скажем, сделав

foo.blah = "bar"

то это изменение будет отражено в file2, потому что вы изменяете существующий объект, на который ссылается имя foo, не заменяя его новым объектом.

Вы можете получить необходимый эффект, выполнив это в file1.py:

import file2
file2.foo = "bar"
test = SomeClass()

(обратите внимание, что вы должны удалить from foo import *), хотя я бы предложил тщательно подумать о том, действительно ли вам нужно это делать. Не очень распространено то, что изменение одной переменной модуля изнутри другого модуля действительно оправдано.

Ответ 4

global является немного неправильным в Python, module_namespace будет более описательным.

Полноценное имя foo равно file1.foo, и глобальное утверждение лучше избегать, поскольку обычно есть лучшие способы выполнить то, что вы хотите сделать. (Я не могу сказать, что вы хотите сделать из своего примера игрушек.)

Ответ 5

Просто поместите свои глобальные переменные в файл, который вы импортируете.

Ответ 6

Все приведенные ответы неверны. Невозможно глобализовать переменную внутри функции в отдельном файле.