Дополнительные возможности модулей

Сокрытие данных в модулях

Конструкция from .. import * импортирует иногда лишнее (что является внутренними переменными и методами модуля и не являются его API).

Как с этим бороться? (Никак, увы.)

  • переменные (и функции) вида _x не доступны при таком импорте;
  • можно в __init__.py файле определить список __all__ и тогда будут импортироваться при * только указанные имена.
__all__ = ['Error', 'encode', 'decode'] # Экспортируются только эти имена

Ничто не мешает нужный метод или переменную импортировать, явно указав имя.

Изменение пути поиска модулей

Т.е. нужно изменить sys.path.

Например:

>>> import sys
>>> sys.path
['', 'C:\\users', 'C:\\Windows\\system32\\python30.zip', ...далее опущено...]
>>> sys.path.append('C:\\sourcedir')        # Дополнение пути поиска модулей
>>> import string                           # Новый каталог будет участвовать в поиске

Так можно полностью переписать пути поиска:

>>> sys.path = [r'd:\temp'] # Изменяет путь поиска модулей
>>> sys.path.append('c:\\lp4e\\examples') # Только для этой программы
>>> sys.path
['d:\\temp', 'c:\\lp4e\\examples']
>>> import string
Traceback (most recent call last):
File "<stdin>", line 1, in ?
ImportError: No module named string

Добавить текущую директорию в sys.path (далее расскажут об используемых модулях и методах).

from os.path import dirname
sys.path.append(dirname(__file__))

Модули - это объекты

Пусть есть модуль М. В нем есть атрибут name.

Доступ к атрибуту:

M.name                  # Полное имя объекта
M.__dict__['name']      # Доступ с использованием словаря пространства имен
sys.modules['M'].name   # Доступ через таблицу загруженных модулей
getattr(M, 'name')      # Доступ с помощью встроенной функции

Документация модулей

В начале модуля можно задать строку документации в тройных кавычках. Файл mydir.py:

"""
mydir.py: описание для чего служит файл
"""

def listing(module, verbose=True):
    # далее код модуля

Написанную документацию для модуля mydir можно вывести как:

>>> import mydir
>>> help(mydir)
Help on module mydir:
NAME
    mydir - mydir.py: описание для чего служит файл
FILE
    c:\users\veramark\mark\mydir.py
FUNCTIONS
    listing(module, verbose=True)

Импортирование модуля в виде строки

Нельзя написать:

>>> import "string"
File "<stdin>", line 1
import "string"
^
SyntaxError: invalid syntax

или

x = "string"
import x        # тут пытаемся импортировать не модуль string, а ищем файл x.py

Выполним код с помощью exec()

>>> modname = 'string'
>>> exec('import ' + modname)   # Выполняется как строка программного кода
>>> string                      # Модуль был импортирован в пространство имен
<module 'string' from 'c:\Python30\lib\string.py'>

или вызовем функцию __import__()

>>> modname = 'string'
>>> string = __import__(modname)
>>> string
<module 'string' from 'c:\Python30\lib\string.py'>

Перегрузка модулей (еще раз)

При перегрузке модуля через reload иногда возникает проблема, что нужно перегрузить все модули, которые были в него импортированы.

Придется писать код, который "вручную" перегружает все необходимые модули. Можно для этого анализировать __dict__ Лутц, стр 679 - пример такого кода.

results matching ""

    No results matching ""