Эта глава описывает основные добавления к языку и библиотеке Python версии 1.4. Многие незначительные изменения здесь не указаны; рекомендуется прочесть файл Misc/NEWS в источнике дистрибутива Python для получения полного списка изменений. В частности, изменения, касающиеся лишь С программистов или процесса построения и установки, не описаны в этой главе (хотя новые инсталляционные выкладки объясняются ниже под sys.prefix ).
Оператор возведения в степень x**y эквивалентен pow(x, y) . Этот оператор имеет более высокий приоритет чем * , / или % и выполняется справа налево при нескольком повторении или при комбинировании с унарными операторами. Например, x**y**z эквивалентно x**(y**z) , и -x**y все равно что -(x**y) .
Комплексные числа. Мнимая часть записывается с суффиксом ‘j ’ (или ‘J ’). Комплексные числа с ненулевой вещественной частью записываются так: (вещ+мнимj ). Можно также использовать новую встроенную функцию complex() , который принимает один или два аргумента: complex(x) эквивалентно x + 0j , и complex(x, y) - это x + y*0j . К примеру, 1j**2 дает complex(-1.0) (что является другим способом сказать "вещественное значение 1.0, представленное как комплексное число").
Комплексные числа всегда представляются как два числа с плавающей точкой - вещественная и мнимая части. Для того, чтобы выделить эти части из комплексного числа z , используйте z.real и z.imag . Функции преобразования в число с плавающей точкой или в целое число (float() , int() и long() ) не работают с вещественными числами. Воспользуйтесь abs(z) для получения его величины (как число с плавающей точкой) или z.real для получения его вещественной части.
Модуль cmath предоставляет версии всех математических функций, принимающих комплексный аргумент, и возвращающих комплексный результат. (Модуль math поддерживает только вещественные числа, поэтому math.sqrt(-1) все еще вызывает исключение ValueError . Эксперты согласны, что так и должно быть.)
Новый синтаксис индексирования. Теперь можно использовать тьюпл в качестве индекса словаря не заключая тьюпл в круглые скобки, т.е. запись x[1, 2, 3] эквивалентна x[(1, 2, 3)] .
Новый кусочный синтаксис. При поддержке расширения Numerical Python (распространяемого отдельно), стало возможным кусочное индексирование в следующей форме: x[lo:hi:stride] (начальный индекс : конечный индекс : шаг); разрешены составные кусочные индексы, разделенные запятыми; и позиции индексов могут быть заменены многоточиями, вот так: x[a, ..., z] . Существует новая встроенная функция slice(lo, hi, stride) и новый встроенный объект Ellipses , которые дают такой же эффект без использования специального синтаксиса. Стандартные последовательные типы еще не поддерживают такую индексацию с кусочными объектами и многоточиями.
Если Вы воспользуетесь этим новым кусочным синтаксисом, будет использован интерфейс словаря, а не последовательности. В частности, при вырезании из экземпляра определенного пользователем класса, с использованием нового кусочного синтаксиса, вызывается метод __getitem__ , а метод __getslice__ вызывается только при использовании простого старого стиля вырезки, т.е. x[lo:hi] , возможно, с опущенным lo и/или hi . Несколько примеров:
x[0:10:2] -> slice(0, 10, 2)
x[:2:] -> slice(None, 2, None)
x[::-1] -> slice(None, None, -1)
x[::] -> slice(None, None, None)
x[1, 2:3] -> (1, slice(2, 3, None))
x[1:2, 3:4] -> (slice(1, 2, None), slice(3, 4, None))
x[1:2, ..., 3:4] -> (slice(1, 2, None), Ellipses, slice(3, 4, None))
Оператор access теперь действительно исключен; access больше не является зарезервированным словом. Это экономит несколько циклов то тут то там.
Появилась ограниченная поддержка приватных идентификаторов класса. Любой идентификатор в форме __spam (по крайней мере два символа подчеркивания в начале и не больше одного символа подчеркивания в конце) теперь буквально заменяется на _classname__spam , где classname текущее имя класса без начальных символов подчеркивания. Такое откатка проделывается не считаясь с синтаксической позицией идентификатора, следовательно, это может быть использовано для определения приватных классу переменных, методов, или даже для хранения переменных экземпляра приватными к его собственному классу, на экземплярах других классов. Округление может осуществляться только когда откатываемое имя не длиннее 255 символов. Во внешних классах и в самом классе, если его имя состоит из одних символов подчеркивания, откатка не производится.
Откатка имени предлагается чтобы дать классам простой способ определения "приватных" экземпляру переменных и методов, без беспокойства насчет переменных экземпляров наследующих классов, или загрязнения экземпляра переменными вне кода класса. Примечание, что правила для откатки разработаны, в основном, для избежание недоразумений; однако, все еще возможно получение доступа или модернизация переменной, которая предполагалась приватной. И это даже может быть полезно, например, для отладчика, что является одной из причин по которой эта лазейка еще не закрыта. (Дефект: вывод класса с таким же именем как у базового класса делает возможным использование приватных переменных базового класса.)
Обратите внимание, что код переданный exec , eval() или evalfile() не рассматривает имя входящего класса в качестве текущего; это напоминает эффект оператора global , который заключается в подобном ограничении, вызванном скомпилированным байт-кодом. Такие же ограничения относятся к getattr() , setattr() и delattr() , а также при непосредственном обращении к __dict__ .
Ниже приводится пример класса, реализующего свои собственные методы __getattr__ и __setattr__ и хранящего все атрибуты в приватных переменных; используется способ, работающий как в Python 1.4 так и в предыдущих версиях:
class VirtualAttributes:
__vdict = None
__vdict_name = locals().keys()[0]
def __init__(self):
self.__dict__[self.__vdict_name] = {}
def __getattr__(self, name):
return self.__vdict[name]
def __setattr__(self, name, value):
self.__vdict[name] = value
Внимание: это экспериментальная особенность. Во избежание всех потенциальных проблем, воздерживайтесь от использования идентификаторов, начинающихся двумя символами подчеркивания, за исключением предопределенных форм, подобных __init__ . При использовании приватных имен избегайте определения таких же приватных имен в наследующих классах; не выполняйте явно (вручную) откатку; и имейте ввиду, что в будущем использование двух начальных символов подчеркивания вновь станет лишь соглашением. В настоящее время происходит обсуждение расширенных описаний времени компиляции, и сейчас невозможно предугадать какое решение в конечном счете будет принято касательно приватных имен. Два лидирующих подчеркивания - все еще кандидат, но, конечно, не единственный. Он добавлен к языку в убеждении о его полезности, так что при его широком испытании он может выиграть. Он не будет удален без предоставления более лучшего решения и пути миграции к нему.
Новая встроенная функция list() любую последовательность в новый список. Если аргумент является списком, то возвращается его свежая копия, подобно тому, что было бы возвращено a[:] .
Улучшены сообщения о синтаксических ошибках. Синтаксические ошибки, обнаруженные на этапе генерации кода байт-код компилятором Python теперь включают номер строки. Номер строки добавляется в скобках. Это подавляется при возникновении ошибки в строке 1 (что часто случается при интерактивном использовании).
Нераспознанный ключевой аргумент теперь вызывает исключение TypeError вместо KeyError .
Исключения в методах __del__ . Когда метод __del__ генерирует исключение, текст предупреждающего сообщения выводится в sys.stderr и затем исключение игнорируется. Прежде такие исключение игнорировались без предупреждения. (Распространение исключения не является возможным, поскольку исключение вызывается уничтожителем объектов, который не может вернуть никакого статуса или ошибки.) (Деффект: новое поведение, пока необходимое для того, чтобы отлаживать неработающие методы __del__ , иногда раздражает, поскольку оно влияет на стандартный поток ошибок программы. Оно выполняет присваивание в sys.stderr , но при желании может быть перенаправлено.)
Теперь Вы можете обнаружить из какого файла был загружен модуль, проверив его атрибут __file__ . Этот атрибут отсутствует у встроенных и замороженных модулей. Он указывает на коллективный файл библиотеки для динамически загружаемых модулей. (Деффект: это может быть относительный путь, сохраненный в .pic файле при компиляции. Если Вы манипулируете с текущим каталогом посредством os.chdir() или переместите .pic файл в другое место, значение может оказаться не корректным.)
Новый встроенный модуль operator . Пока не документирован, но понятие действительно простое: operator.__add__(x, y) делает то же самое, что x+y (для всех типов – встроенных, определенных пользователем, определенных расширением). Ради удобства, operator.add делает то же самое, но будьте осмотрительны – нельзя использовать operator.and и несколько других, у которых "настоящее" имя оператора является зарезервированным словом. В этом случае необходимо добавить один последующий символ подчеркивания.
Новый встроенный модуль errno . Смотрите "Справочное руководство библиотеки Python".
Переписан cgi модуль. Смотрите "Справочное руководство библиотеки Python".
Улучшен модуль ограниченного исполнения (rexec ). Новый модуль Bastion . Оба описаны в новой главе "Справочного руководства библиотеки Python", посвященной ограниченному исполнению.
Новые строковые операции (все описаны в "Справочном руководстве библиотеки Python"): lstrip() , rstrip() (удаление левых/правых пробелов), capitalize() (сделать прописной первую букву, остальные сделать строчными), capwords() (записать с прописной буквы каждое слово, ограниченное string.split() ), translate() (перевод строки, он существовал и раньше, но теперь может также и удалять символы путем задания третьего аргумента), maketrans() (удобная функция создания таблиц переводов для translate() и regex.compile() ). Строковая функция split() имеет необязательный третий аргумент, определяющий максимальное число разделителей для разбивки; например, string.split(‘a=b=c’, ‘=’, 1) дает [‘a’, ‘b=c’] . (Примечание, что долгое время split() и splitfields() – синонимы.)
Новые операции regsub (смотрите "Справочное руководство библиотеки Python"): regsub.capwords() (подобен string.capwords() , но дает определить слово-разделитель как в регулярных выражениях), regsub.splitx() (похож на regsub.split() , но возвращает разделители и слова в результирующем списке). Необязательный аргумент maxsep также поддерживается regsub.spit() .
Модульные файлы pdb.py и profile.py теперь могут быть вызваны как скрипты для более легкой отладки других скриптов Например: python /usr/local/lib/python1.4/profile.py myscript.py
Модуль os теперь поддерживает функцию putenv() на тех системах, где это доступно в библиотеке С (Windows NT и большинство Unix версии). К примеру, os.puenv(‘PATH’, ‘/bin:/usr/bin’) устанавливает переменную окружения PATH в строку ‘/bin:/usr/bin’ . Такие изменения переменных окружения влияют на подпроцессы, запущенные посредством os.system() , os.popen() или os.fork() и os.execv() . Когда putenv() поддерживается, присваивания элементам в os.environ автоматически транслируются в соответствующие вызовы os.putenv() ; однако, вызовы, обращенные к os.putenv() не обновляют os.environ , поэтому, действительно предпочтительнее присваивания элементам os.environ . Исключительно для этой цели тип os.environ к подклассу UserDict.UserDict , когда os.putenv поддерживается. (Дефект: os.execve() все еще требует настоящий словарь, поэтому он не примет os.environ в качестве своего третьего аргумента. Тем не менее Вы можете воспользоваться execv() , который будет работать с Вашими изменениями в os.environ !)
Более новые функции в модуле os : mkfifo , plock , remove (== unlink ), и ftruncate . Смотрите руководство Unix (раздел 2, системные вызовы) по этим функциям. Несколько новых функции также доступны под NT.
Новые функции в модуле fcntl: lockf() и flock() (не спрашивайте :-) ). Смотрите "Справочное руководство библиотеки Python".
Первый элемент в пути поиска модулей, sys.path[0] , является каталогом, содержащим скрипт, использованный для вызова интерпретатора Python. Если каталог скрипта недоступен, (например, интерпретатор запущен интерактивно или скрипт был считан со стандартного ввода), sys.path[0] будет пустой строкой, заставляющей Python искать модули сначала в текущем каталоге. Замечание, что каталог скрипта вставляется перед данными, вставленными как результат $PYTHONPATH . В пути больше нет никаких последующих данных для текущего каталога (если явно не установлено в $PYTHONPATH или не переопределено во время построения).
Python программам теперь доступно больше конфигурирующей информации. Переменная sys.prefix дает специфичный префикс каталога, в котором инсталлированы платформо-независимые файлы Python; по умолчанию, это строка "/usr/local" . Данный каталог может быть назначен во время построения с помощью аргумента --prefix скрипта configure . Основной набор библиотечных модулей инсталлируется в каталог sys.prefix+"/lib/python1.4" в то время как платформо-независимые заголовочные файлы (все за исключением config.h ) хранятся в sys.prefix+"/include/python1.4" .
Аналогично, переменная sys.exec_prefix дает специфичный префикс каталога, в котором инсталлированы платформо-зависимые файлы Python; по умолчанию, это также "/usr/local" . Данный каталог может быть назначен во время построения с помощью аргумента --exec-prefix скрипта configure . Особо все конфигурационные файлы (напр., заголовочный файл config.h ) устанавливаются в каталог sys.exec_prefix+"/lib/python1.4/config" , а коллективные библиотечные модули инсталлируются в sys.exec_prefix+"/lib/python1.4/sharedmodules" .
Включаемые файлы находятся в sys.prefix+"/include/python1.4" .
На не-Unix системах эти переменные бессмысленны.
В то время как платформам настоятельно не рекомендуется модифицировать стандартную библиотеку Python (вроде добавления платформо-специфичных модулей или функций), в настоящее время появился стандартный способ вызова платформо-специфичных особенностей. Стандартный модуль site , после импортирования, добавляет два платформо-зависимых каталога в конец sys.path : $prefix/lib/site-python и $exec_prefix/lib/site-python , где $prefix и $exec_prefix – каталоги sys.prefix и sys.exec_prefix , упомянутых выше.
После таких манипуляций с путями, делается попытка импортирования модуля sitecustomize . Любое исключение ImportError , возникшее вследствие этой попытки, тихонько игнорируется.
|
|