как работают переменные модуля 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 

Что дает?

  • Модуль импорта Python из папки sibling
  • Относительные модули импорта из подпапки родительских папок
  • ImportError: библиотека «enchant» C не найдена. Установите его через диспетчер пакетов ОС или используйте предварительно построенное двоичное колесо от PyPI
  • Не удалось найти модуль shiboken python от PySide
  • Как импортировать все подмодули?
  • Как импортировать модуль, когда в имени модуля есть «-» тире или дефис?
  • Когда или почему использовать относительный импорт в Python
  • Как импортировать или включать структуры данных (например, dict) в файл Python из отдельного файла
  • 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'] 

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

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