Анимация
JavaScript


Главная  Библионтека 

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

10.3.11 Инструкция exec

Инструкция exec expression [in globals, [locals]] предназначена для динамического выполнения кода. Выражение expression должно давать объект типа code, string или file (открытый для чтения). Если expression является объектом кода, инструкция exec просто выполняет его. Строка или файл считаются содержащими инструкции языка Python, которые должны быть выполнены (если не содержат синтаксических ошибок).

Выражения globals и locals должны давать словари, которые будут использованы как глобальное и локальное пространства имен. Если аргументы опущены, код выполняется в текущей области видимости. Если указан только аргумент globals, он используется в качестве глобального и локального пространств имен. В текущих реализациях в эти словари автоматически добавляется запись (если такой нет) с ключом builtins , ссылающаяся на словарь пространства встроенных имен (то есть, модуля builtin ).

Динамическое вычисление выражений осуществляется с помощью встроенной функции eval() . Также могут быть полезны встроенные функции globals() и locals() , которые возвращают словари, соответствующие текущим глобальному и локальному пространствам имен.

В текущих реализациях многострочные составные инструкции должны заканчиваться переходом на новую строку. Так,exec for i in (1,2):\n\tprint i\n будет работать нормально, но при попытке выполнить exec for i in (1,2):\n\tprint i будет сгенерировано исключение SyntaxError.

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

Поиск модулей производится сначала среди встроенных в интерпретатор, затем в путях, хранящихся в списке sys.path. sys.path при запуске интерпретатора содержит текущий каталог, список каталогов из переменной окружения PYTHONPATH и зависящие от платформы пути по умолчанию. Если модуль с указанным именем не найден, генерируется исключение ImportError.

Импортируемые имена не должны использоваться в инструкции global в той же области видимости. В текущих реализациях такие имена просто не будут импортированы, однако в будущих версиях поведение может измениться.

Запись from ... import * рекомендуется использовать только в глобальной области видимости.

Вы можете изменить поведение инструкции import, переопределив встроенную функцию import () . При этом будут полезны средства, определенные в модуле imp.



10.3.13 Генерация исключений

Инструкция raise [exprl [, expr2 [, expr3]]] следует использовать в случае возникновения ошибок и других исключительных ситуаций. Без аргументов инструкция raise повторно генерирует последнее исключение, сгенерированное в текущей области видимости.

Иначе вычисляется значение выражения exprl, которое должно быть строкой, классом или экземпляром класса. Если задан второй аргумент (выражение expr2), вычисляется его значение, в противном случае подставляется None. Если первый аргумент является объектом-классом и второй аргумент является экземпляром этого или производного от него класса, expr2 используется в качестве генерируемого исключения. Если же второй аргумент не является таким экземпляром, он используется для инициализации класса exprl следующим образом: если выражение expr2 является кортежем, то оно используется в качестве списка аргументов; если expr2 равно None, класс инициализируется с пустым списком аргументов; в остальных случаях expr2 используется как единственный аргумент при инициализации. Если же первый аргумент инструкции

10.3.12 Отладочные утверждения

Общепринятый способ включения в программу отладочных утверждений - инструкция assert expression [, exc arg] . Если выражение expression ложно, генерируется исключение AssertionError. Если задан необязательный второй аргумент exc arg, то он используется в качестве аргумента, передаваемого конструктору исключения. При компиляции с оптимизацией инструкции assert игнорируются.

Простая форма assert expression эквивалентна конструкции (предполагается, что идентификаторы debug и AssertionError ссылаются на встроенные

переменные с такими именами; встроенная переменная debug равна 1 при отключенной оптимизации)

if debug :

if not expression: raise AssertionError()

Расширенная форма assert expression, exc arg эквивалентна конструкции

if debug :

if not expression: raise AssertionError( exc arg)

В качестве аргумента exc arg можно, например, использовать строку, поясняющую возможную причину невыполнения утверждения. Заметим, что нет необходимости включать в нее исходный текст выражения expression, так как он в любом случае будет включен в выводимую (если исключение не перехвачено) отладочную информацию.



10.4 Составные инструкции

Составные инструкции содержат другие инструкции и каким-либо образом управляют их выполнением. Обычно составные инструкции записываются в несколько логических строк с использованием отступов, хотя, если составная инструкция имеет только одну ветвь, тело которой содержит только простые инструкции, она может быть записаны в одну логическую строку.

Инструкции if, while и for реализуют традиционные средства управления логикой программы. Инструкция try устанавливает обработчик исключений. Определения функций и классов также являются составными инструкциями.

Составная инструкция состоит из одной или нескольких ветвей. Каждая ветвь состоит из заголовка и тела. Заголовки ветвей одной составной инструкции должны иметь одинаковый уровень отступа. Заголовок каждой ветви начинаются уникальным ключевым словом и заканчиваются двоеточием. Тело является набором инструкций, управляемых данной ветвью. Тело может содержать одну или несколько разделенных точкой с запятой простых инструкций, записанных в одной логической строке с заголовком (сразу после двоеточия), или одну или несколько произвольных инструкций на непосредственно следующих за заголовком стоках, имеющих по сравнению с заголовком дополнительный отступ. Только вторая форма записи тела ветви может содержать составные инструкции. Следующий пример является недопустимым, в первую очередь потому, что не очевидно, к какой из инструкций if должна была бы относиться ветвь else:

if test1: if test2: print x

Логическая строка не может содержать несколько инструкций, если хотя бы одна из них является составной. В следующем примере все инструкции print входят в тело основной ветви инструкции if :

if x < y < z: print x; print y; print z

raise является экземпляром класса, он используется в качестве исключения (второй аргумент должен быть равен None или опущен).

Поддержка строк в качестве исключений существует лишь для совместимости со старыми версиями и может быть удалена в будущих версиях языка. И, тем не менее, если первый аргумент является строкой, он используется в качестве исключения. В этом случае второй аргумент (или None) является ассоциированным с исключением значением.

Третий аргумент, если задан и не равен None, должен быть объектом traceback (см. раздел 11.9.3). В этом случае он используется вместо объекта, создаваемого для текущего положения, для указания на место возникновения исключительной ситуации.



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