Search     or:     and:
 LINUX 
 Language 
 Kernel 
 Package 
 Book 
 Test 
 OS 
 Forum 
 iakovlev.org 
 Languages
 С
 GNU С Library 
 Qt 
 STL 
 Threads 
 C++ 
 Samples 
 stanford.edu 
 ANSI C
 Libs
 LD
 Socket
 Pusher
 Pipes
 Encryption
 Plugin
 Inter-Process
 Errors
 Deep C Secrets
 C + UNIX
 Linked Lists / Trees
 Asm
 Perl
 Python
 Shell
 Erlang
 Go
 Rust
 Алгоритмы
NEWS
Последние статьи :
  Тренажёр 16.01   
  Эльбрус 05.12   
  Алгоритмы 12.04   
  Rust 07.11   
  Go 25.12   
  EXT4 10.11   
  FS benchmark 15.09   
  Сетунь 23.07   
  Trees 25.06   
  Apache 03.02   
 
TOP 20
 Linux Kernel 2.6...5170 
 Trees...940 
 Максвелл 3...871 
 Go Web ...823 
 William Gropp...803 
 Ethreal 3...787 
 Gary V.Vaughan-> Libtool...773 
 Ethreal 4...771 
 Rodriguez 6...765 
 Ext4 FS...755 
 Clickhouse...754 
 Steve Pate 1...754 
 Ethreal 1...742 
 Secure Programming for Li...732 
 C++ Patterns 3...716 
 Ulrich Drepper...697 
 Assembler...695 
 DevFS...662 
 Стивенс 9...649 
 MySQL & PosgreSQL...632 
 
  01.01.2024 : 3621733 посещений 

iakovlev.org

Python Tutorial 3


6. Модули

Можно работать в среде интерпретатора , а можно написать отдельный скрипт . Если программа большая , она может состоять из нескольких скриптов . Можно написать отдельную функцию , которая будет использоваться множеством других программ . Это можно реализовать с помощью модулей . Набор переменных и методов одного модуля может быть импортирован в другой модуль . Имя файла совпадает с именем модуля . Создадим модуль fibo.py :

# Fibonacci numbers module
 
 def fib(n):    # write Fibonacci series up to n
     a, b = 0, 1
     while b < n:
         print b,
         a, b = b, a+b
 
 def fib2(n): # return Fibonacci series up to n
     result = []
     a, b = 0, 1
     while b < n:
         result.append(b)
         a, b = b, a+b
     return result
 

Теперь запустим его из-под интерпретатора :

>>> import fibo
 

Теперь у нас есть доступ к его функциям :

>>> fibo.fib(1000)
 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
 >>> fibo.fib2(100)
 [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
 >>> fibo.__name__
 'fibo'
 

Можно организовать локальную функцию :

>>> fib = fibo.fib
 >>> fib(500)
 1 1 2 3 5 8 13 21 34 55 89 144 233 377
 

Модуль может импортировать другой модуль :

>>> from fibo import fib, fib2
 >>> fib(500)
 1 1 2 3 5 8 13 21 34 55 89 144 233 377
 
Другой вариант :

>>> from fibo import *
 >>> fib(500)
 1 1 2 3 5 8 13 21 34 55 89 144 233 377
 

Будут импортированы все имена .


6.1.1 Путь

При импорте модуля интерпретатор ищет скрипт в текущей директории . После чего просматривается список директорий , определенный в переменной PYTHONPATH , которая имеет такой же вид , как и системная переменная PATH. После чего поиск может быть продолжен в /usr/local/lib/python.

6.1.2 ``Компиляция''

Файл с расширением spam.pyc представляет из себя``byte-compiled'' версию исходника. Содержание откомпилированной версии платформенно-независимое и может использоваться на различных платформах .

  • Опция интерпретатора -O генерит файл с расширением .pyo . Получается оптимизированный байт-код .

  • Опция интерпретатора (-OO) создаст более оптимизированный код .

  • Откомпилированные версии не выполняются быстрее самих исходников , они просто быстрее загружаются

  • Для уменьшеня времени загрузки скрипта нужно использовать модули . При этом тело самого скрипта может быть небольшим , а функции вызываться из модуля .

  • Компиляция позволяет создавать дистрибутивные библиотеки для сторонних пользователей .

  • Модуль compileall позволяет создавать .pyc файлы или .pyo файлы с использованием опции -O для всего каталога .


6.2 Стандартные модули

В питоне есть библиотека стандартных модулей . Некоторые модули встроены в интерпретатор. Например модуль sys встроен в каждый интерпретатор . Переменные sys.ps1 , sys.ps2 используются в prompts вашего интерпретатора в интерактивном режиме :

>>> import sys
 >>> sys.ps1
 '>>> '
 >>> sys.ps2
 '... '
 >>> sys.ps1 = 'C> '
 C> print 'Yuck!'
 Yuck!
 C>
 

Переменная sys.path берется из системной переменной PYTHONPATH, ее можно модифицировать :

>>> import sys
 >>> sys.path.append('/ufs/guido/lib/python')
 


6.3 Функция dir()

Встроенная функция dir() используется для вывода всех идентификаторов модуля :

>>> import fibo, sys
 >>> dir(fibo)
 ['__name__', 'fib', 'fib2']
 >>> dir(sys)
 ['__displayhook__', '__doc__', '__excepthook__', '__name__', '__stderr__',
  '__stdin__', '__stdout__', '_getframe', 'api_version', 'argv',
  'builtin_module_names', 'byteorder', 'callstats', 'copyright',
  'displayhook', 'exc_clear', 'exc_info', 'exc_type', 'excepthook',
  'exec_prefix', 'executable', 'exit', 'getdefaultencoding', 'getdlopenflags',
  'getrecursionlimit', 'getrefcount', 'hexversion', 'maxint', 'maxunicode',
  'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_cache',
  'platform', 'prefix', 'ps1', 'ps2', 'setcheckinterval', 'setdlopenflags',
  'setprofile', 'setrecursionlimit', 'settrace', 'stderr', 'stdin', 'stdout',
  'version', 'version_info', 'warnoptions']
 

Без аргументов эта функция dir() выдает список текущих идентификаторов :

>>> a = [1, 2, 3, 4, 5]
 >>> import fibo, sys
 >>> fib = fibo.fib
 >>> dir()
 ['__name__', 'a', 'fib', 'fibo', 'sys']
 
Для вывода списка встроенных имен-функций нужно использовать модуль __builtin__ :

>>> import __builtin__
 >>> dir(__builtin__)
 ['ArithmeticError', 'AssertionError', 'AttributeError',
  'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError',
  'Exception', 'False', 'FloatingPointError', 'IOError', 'ImportError',
  'IndentationError', 'IndexError', 'KeyError', 'KeyboardInterrupt',
  'LookupError', 'MemoryError', 'NameError', 'None', 'NotImplemented',
  'NotImplementedError', 'OSError', 'OverflowError', 'OverflowWarning',
  'PendingDeprecationWarning', 'ReferenceError',
  'RuntimeError', 'RuntimeWarning', 'StandardError', 'StopIteration',
  'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError',
  'True', 'TypeError', 'UnboundLocalError', 'UnicodeError', 'UserWarning',
  'ValueError', 'Warning', 'ZeroDivisionError', '__debug__', '__doc__',
  '__import__', '__name__', 'abs', 'apply', 'bool', 'buffer',
  'callable', 'chr', 'classmethod', 'cmp', 'coerce', 'compile', 'complex',
  'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod',
  'enumerate', 'eval', 'execfile', 'exit', 'file', 'filter', 'float',
  'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id',
  'input', 'int', 'intern', 'isinstance', 'issubclass', 'iter',
  'len', 'license', 'list', 'locals', 'long', 'map', 'max', 'min',
  'object', 'oct', 'open', 'ord', 'pow', 'property', 'quit',
  'range', 'raw_input', 'reduce', 'reload', 'repr', 'round',
  'setattr', 'slice', 'staticmethod', 'str', 'string', 'sum', 'super',
  'tuple', 'type', 'unichr', 'unicode', 'vars', 'xrange', 'zip']
 


6.4 Пакеты

Пакеты - это способ структуризации набора модулей в единый namespace с использованием технологии ``dotted module names''. Например A.B - модуль с именем "B" входит в пакет с именем "A". Единый namespace избавляет автора от заботы по поводу глобальных переменных .

Предположим , нужно разработать пакет для управления м-пегами . Существует множество музыкальных форматов - .wav, .aiff, .au, поэтому прийдется разработать целый набор модулей . Возможная структура такого пакета :

Sound/                          Top-level package
       __init__.py               Initialize the sound package
       Formats/                  Subpackage for file format conversions
               __init__.py
               wavread.py
               wavwrite.py
               aiffread.py
               aiffwrite.py
               auread.py
               auwrite.py
               ...
       Effects/                  Subpackage for sound effects
               __init__.py
               echo.py
               surround.py
               reverse.py
               ...
       Filters/                  Subpackage for filters
               __init__.py
               equalizer.py
               vocoder.py
               karaoke.py
               ...
 

При импорте пакета питон будет искать его каталог в переменной sys.path .

Файлы , имеющие формат __init__.py необходимы для определения входящих подкаталогов . __init__.py может быть просто пустым файлом , но также может выполнять инициализирующий код или устанавливать переменные .

С помощью следующего префикса из пакета можно импортировать отдельные модули :

import Sound.Effects.echo
 

Вызов :

Sound.Effects.echo.echofilter(input, output, delay=0.7, atten=4)
 

Альтернативный путь импортирования модулей :

from Sound.Effects import echo
 

И его вызов :

echo.echofilter(input, output, delay=0.7, atten=4)
 

Еще один вариант импортирования напрямую :

from Sound.Effects.echo import echofilter
 

И вызов echofilter() :

echofilter(input, output, delay=0.7, atten=4)
 


6.4.1 Импорт с префиксом *

Что произойдет , если вызвать from Sound.Effects import *? Нет никакой гарантии , что это будет работать на MAC или Windows - платформах , поскольку в них регистр имени модуля не различается , что подчас имеет значение .

Необходимо , чтобы в файле __init__.py был определен список __all__, который включает в себя список модулей , обязательных при импортировании с префиксом frompackage import *. Например , файл Sounds/Effects/__init__.py может включать следующий код :

__all__ = ["echo", "surround", "reverse"]
 

Это означает , что команда from Sound.Effects import * импортирует 3 модуля в пакете Sound .

Если __all__ не определено , команда from Sound.Effects import * не будет импортировать все модули из каталога Sound.Effects; будут импортированы лишь те имена , которые определены явно в __init__.py или в самом пакете . Рассмотрим код :

import Sound.Effects.echo
 import Sound.Effects.surround
 from Sound.Effects import *
 

Здесь первые 2 модуля импортируются явно .

Вообще , префикс типа from Package import specific_submodule надежен в том смысле , что не будет конфликтов при импорте модулей с одинаковыми названиями из разных модулей .

6.4.2 Ссылки на пакеты

Модули часто ссылаются друг на друга . Например , surround может использовать echo . Модуль surround может просто использовать import echo или from echo import echofilter. Если модуль не найден в текущем пакете , поиск будет продолжен на уровень выше .

Когда пакеты структурированы в подпакеты (Sound),другие модули из этого-же пакета должны вызываться с полным путем , например если модуль Sound.Filters.vocoder вызывает echo модуль из Sound.Effects , нужно писать from Sound.Effects import echo.

Пакеты поддерживают еще один атрибут - __path__. В него входи имя каталога , в котором лежит головной __init__.py , и код которого выполняется в первую очередь .
Оставьте свой комментарий !

Ваше имя:
Комментарий:
Оба поля являются обязательными

 Автор  Комментарий к данной статье