#python-3.x
#python-3.x
Вопрос:
Я запускаю файл Python, скажем file1, и в нем я импортирую другой файл python, скажем file2, и вызываю одну из его функций. Теперь файлу 2 требуется значение переменной, которая определена в файле 1. Кроме того, перед импортом file2 в file1 значение переменной было изменено во время выполнения. Как мне создать файл file2
, получить доступ к текущему значению переменной из файла 1?
Содержимое file1 является:
variable = None
if __name__ == '__main__':
variable = 123
from file2 import func1
func1()
Содержимое file2 является:
from file1 import variable as var
def func1():
print(var)
Когда я запускаю файл1, я хочу, чтобы функция func1
в file2 выводила 123. Но он печатает None
. Один из способов, которым я могу решить эту проблему, — сохранить содержимое переменной в каком-нибудь обычном файле, когда он изменен, а затем извлечь его при необходимости. Но приложение, в котором я использую этот код, имеет огромный размер переменной, примерно 300 МБ. Поэтому я считаю, что будет недостаточно эффективно записывать содержимое переменной в текстовый файл каждый раз, когда он изменяется. Как мне это сделать? (Любые предложения приветствуются)
Комментарии:
1. Почему бы вам просто не передать
var
в качестве параметра?2. @MisterMiyagi Это определенно решило бы мою проблему. Но просто интересно, как получить доступ к значениям переменных во время выполнения в каком-то другом файле.
Ответ №1:
Основной скрипт запускается с именем __main__
, а не по имени его модуля. Так же работает if __name__ == '__main__'
проверка. Импортируя его по обычному имени, создается отдельный модуль с обычным содержимым.
Если вы хотите получить доступ к его атрибутам, импортируйте его как __main__
:
from __main__ import variable as var
def func1():
print(var)
Обратите внимание, что импорт __main__
является хрупким. Помимо дублирования модуля, вы можете импортировать другой модуль, если структура вашей программы изменится. Если вы хотите обмениваться глобальными данными, используйте четко определенные имена модулей:
# constants.py
variable = None
# file1.py
if __name__ == '__main__':
import constants
constants.variable = 123
from file2 import func1
func1()
# file2.py
from constants import variable as var
def func1():
print(var)
Обязательный отказ от ответственности: в идеале функции не полагаются на глобальные переменные. Используйте параметры для передачи переменных в функции:
# constants.py
variable = None
# file1.py
if __name__ == '__main__':
from file2 import func1
func1(123)
# file2.py
from constants import variable
def func1(var=variable):
print(var)
Комментарии:
1. Это здорово. Использование
__main__
несколько усложняет ситуацию. Пакет constants отлично подходит для обмена глобальными данными. Спасибо за ваш вклад. Я проверю больше оconstants
пакете, чтобы увидеть, какие другие функции он предоставляет.2. @VighneshRaut
constants
— это просто имя, которое я придумал. Просто выберите имя, уникальное для вашего пакета / среды, и создайте модуль только с переменными внутри.