как работают переменные модуля python?

Раньше я думал, что после загрузки модуля повторный импорт не будет выполнен, если другие файлы импортируют тот же модуль или импортированы по-разному. Например, у меня есть mdir/__init__.py , который пуст, и mdir/mymod.py , который:

 thenum = None def setNum(n): global thenum if thenum is not None: raise ValueError("Num already set") thenum = n def getNum(): if thenum is None: raise ValueError("Num hasn't been set") return thenum 

Первые несколько случаев использования одного и того же файла идут в соответствии с ожиданием. Этот файл ./usage.py , та же папка mdir находится в:

 import mdir.mymod mdir.mymod.setNum(4) print mdir.mymod.getNum() from mdir import mymod print mymod.getNum() from mdir.mymod import * print getNum() try: setNum(10) except ValueError: print "YHep, exception" 

Ожидается выход:

 4 4 4 YHep, exception 

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

 #BEHOLD import sys sys.path.append("mdir") import mymod try: mymod.getNum() except ValueError: print "Should not have gotten exception" mymod.setNum(10) print mymod.getNum() print mdir.mymod.getNum() 

Этот код, работающий после предыдущего кода, дает:

 Should not have gotten exception 10 4 

Что дает?

One Solution collect form web for “как работают переменные модуля python?”

mymod и mdir.mymod считаются разными модулями – вот несколько связанных дискуссий: http://code.djangoproject.com/ticket/3951

Объяснение:

Лучше всего играть с интерактивным интерпретатором python и сами убедиться. Я создал каталог (пакет) mydir под некоторым каталогом и внутри него два файла (модули) – __init__.py и mymod.py , оба пустые. Я начал питон внутри каталога, содержащего mydir . Теперь посмотрим, что получится:

 >>> import mydir.mymod >>> from mydir import mymod >>> mymod == mydir.mymod True 

Почему mymod и mydir.mymod считают одно и то же? Ну, оба названия относятся к одному и тому же модулю. Модуль – равенство модулей определяется их путем сравнения путей:

 >>> mymod <module 'mydir.mymod' from 'mydir\mymod.py'> >>> mydir.mymod <module 'mydir.mymod' from 'mydir\mymod.py'> 

Теперь, если я sys.path чтобы содержать mydir и импортировать mymod таким образом, что путь импортируемого модуля будет выглядеть иначе:

 >>> import sys >>> sys.path.append( "d:/zrodla/stack/mydir" ) # note that importing mymod (and not mydir.mymod) prior to appending mydir to # path would cause an error >>> mymod2 <module 'mymod' from 'd:/zrodla/stack/mydir\mymod.pyc'> >>> mymod2 == mydir.mymod False 

то итоговые объекты модуля не будут сравниваться. Таким образом, один модуль будет импортирован дважды – это нормально, и так работает python. Просто помните, что импортированные модули идентифицируются по их путям – точнее, «пунктирными путями», я думаю – посмотрите на ключи sys.modules :

 >>> [x for x in sys.modules.keys() if "my" in x] ['mydir', 'mymod', 'mydir.mymod'] 

Надеюсь, теперь это ясно.

Interesting Posts

Не удалось настроить Anaconda на Windows: проблемы с контуром

API YouTube без пользовательского процесса OAuth

Только рекурсивные каталоги Chmod?

Принятие адреса электронной почты в качестве имени пользователя в Django

Попытка вытащить сообщения и комментарии из Facebook для проекта, но не может получить все (python, json)

Код занимает слишком много времени

Итерация по связанным объектам в Django: цикл по запросу или использование однострочного select_related (или prefetch_related)

Какие хорошие решения ORM для Python?

Длительная медленная работа в представлении Django вызывает таймаут. В любом случае для Python вместо этого говорить AJAX?

Загрузка изображений с помощью BeautifulSoup

список методов оболочки python?

Сравнение поворотных списков в python

Преобразование времени RFC 3339 в стандартную метку времени Python

Caffe net.predict () выводит случайные результаты (GoogleNet)

Чтение файла данных Matlab в Python, необходимость экспорта в CSV

Python - лучший язык программирования в мире.