Анимация
JavaScript
|
Главная Библионтека жать код инициализации пакета и/или устанавливать переменную all , описанную ниже. Пользователи пакета могут импортировать индивидуальные модули пакета, например: import Sound.Effects.echo В этом случае загружается модуль Sound.Effects.echo. На него нужно ссылаться по полному имени: Sound.Effects.echo.echofilter(input, output, delay=0.7, atten=4) Вы можете использовать альтернативный способ импортирования подмодуля: from Sound.Effects import echo В этом случае также загружается модуль Sound.Effects.echo, и делает его доступным для использования без префикса: echo.echofilter(input, output, delay=0.7, atten=4) Еще один вариант - импортировать желаемую функцию или переменную непосредственно: from Sound.Effects.echo import echofilter И в этом случае загружается модуль Sound.Effects.echo, но на этот раз, функция echofilter() становится доступной для использования непосредственно: echofilter(input, output, delay=0.7, atten=4) Заметим, что при использовании from package import item, item может быть модулем, подпакетом или другим именем, определенном в пакете package, таким как функция, класс или переменная. Инструкция import сначала проверяет, определено ли имя item в пакете, если нет, считает его модулем и пытается загрузить. Если при загрузке возникает ошибка, генерируется исключение ImportError. И наоборот, при использовании инструкции import item, subitem. subsubitem, каждая единица, кроме последней, должна быть пакетом. Последняя единица может быть модулем или пакетом, но не может быть классом, функцией или переменной, определенной в предыдущей единице. all = ["echo", "surround", "reverse"] Это означает, что from Sound.Effects import * импортирует три указанных модуля из пакета Sound. Если список all не определен,from Sound.Effects import * не будет импортировать все модули пакета Sound.Effects, а только имена, явным образом определенные в инициализационном файле init .py (включая явно импортированные в нем модули). Кроме того, в текущую область видимости попадут модули пакета, явно загруженные предыдущими инструкциями import, например: import Sound.Effects.echo import Sound.Effects.surround from Sound.Effects import * В приведенном примере, модули echo и surround импортируются в текущее пространство имен, потому что они уже определены в пакете Sound.Effects на момент выполнения инструкции from ... import. Заметим, что импортирование всех имен, определенных в модуле или пакете, обычно приводит к засорению пространства имен и, как результат, к возможным конфликтам. (Некоторые модули специально спроектированы таким образом, чтобы экспортировать только имена, следующие определенному шаблону.) Кроме того, при этом глобальные переменные модуля становятся доступными только для чтения - при попытке присвоить такой переменной новое значение Вы создадите новую (локальную) переменную с таким же именем. А все изменения, внесенные в глобальные переменные модуля после его инициализации, не будут видны за его пределами. 6.6.1 Импортирование всего содержимого пакета (модуля) Что же происходит, когда пользователь использует from Sound.Effects import *? В идеале, интерпретатор должен каким-либо образом обойти файлы, находящиеся в каталоге пакета, и импортировать их все. К сожалению, такой подход не будет работать достаточно хорошо на таких платформах, как Macintosh и Windows, где файловая система не всегда имеет точную информацию о регистре букв в именах файлов. В этом случае нет надежного пути узнать, с каким именем должен быть импортирован файл с именем ECHO.PY : echo, Echo или ECHO. Единственный выход для автора - снабдить пакет явным указателем его содержимого. Инструкция import использует следующее соглашение: если в иници-ализационном файле init .py определен список с именем all , он используется в качестве списка имен модулей, которые должны импортироваться при использовании from package import *. Поддержка этого списка в соответствии с текущим составом пакета возлагается на автора. Можно также не определять список all , если авторы не считают уместным импортирование *. Например, файл Sounds/Effects/ init .py может содержать следующий код: 6.6.2 Связи между модулями пакета Часто возникает необходимость в связях между модулями одного пакета. Например, модуль surround может использовать модуль echo . В самом деле, подобные связи распространены настолько, что инструкция import сначала просматривает содержимое пакета, в который входит содержащий эту инструкцию модуль, и только потом в путях поиска модулей. Таким образом, модуль surround может просто использовать import echo или from echo import echofilter . Когда пакеты разделены на подпакеты (пакет Sound в примере), нет краткой записи для ссылок между ответвлениями пакета - нужно использовать полное имя. Например, если модуль Sound.Filters.vocoder должен использовать модуль echo пакета Sound.Effects, нужно использоватьfrom Sound.Effects import echo. Мы рекомендуем стараться использовать запись from package import specific module , за исключением случаев, когда необходимо использовать модули с одинаковыми именами из разных пакетов. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 [ 16 ] 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |