InfoCity
InfoCity - виртуальный город компьютерной документации
Реклама на сайте







Размещение сквозной ссылки

 

Глава 13. Новое в версии 1.4


Эта глава описывает основные добавления к языку и библиотеке Python версии 1.4. Многие незначительные изменения здесь не указаны; рекомендуется прочесть файл Misc/NEWS в источнике дистрибутива Python для получения полного списка изменений. В частности, изменения, касающиеся лишь С программистов или процесса построения и установки, не описаны в этой главе (хотя новые инсталляционные выкладки объясняются ниже под sys.prefix).


13.1 Изменения в языке


  • Оператор возведения в степень 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__. При использовании приватных имен избегайте определения таких же приватных имен в наследующих классах; не выполняйте явно (вручную) откатку; и имейте ввиду, что в будущем использование двух начальных символов подчеркивания вновь станет лишь соглашением. В настоящее время происходит обсуждение расширенных описаний времени компиляции, и сейчас невозможно предугадать какое решение в конечном счете будет принято касательно приватных имен. Два лидирующих подчеркивания - все еще кандидат, но, конечно, не единственный. Он добавлен к языку в убеждении о его полезности, так что при его широком испытании он может выиграть. Он не будет удален без предоставления более лучшего решения и пути миграции к нему.


13.2 Изменения в инструментах времени выполнения


  • Новая встроенная функция list() любую последовательность в новый список. Если аргумент является списком, то возвращается его свежая копия, подобно тому, что было бы возвращено a[:].

  • Улучшены сообщения о синтаксических ошибках. Синтаксические ошибки, обнаруженные на этапе генерации кода байт-код компилятором Python теперь включают номер строки. Номер строки добавляется в скобках. Это подавляется при возникновении ошибки в строке 1 (что часто случается при интерактивном использовании).

  • Нераспознанный ключевой аргумент теперь вызывает исключение TypeError вместо KeyError.

  • Исключения в методах __del__. Когда метод __del__ генерирует исключение, текст предупреждающего сообщения выводится в sys.stderr и затем исключение игнорируется. Прежде такие исключение игнорировались без предупреждения. (Распространение исключения не является возможным, поскольку исключение вызывается уничтожителем объектов, который не может вернуть никакого статуса или ошибки.) (Деффект: новое поведение, пока необходимое для того, чтобы отлаживать неработающие методы __del__, иногда раздражает, поскольку оно влияет на стандартный поток ошибок программы. Оно выполняет присваивание в sys.stderr, но при желании может быть перенаправлено.)

  • Теперь Вы можете обнаружить из какого файла был загружен модуль, проверив его атрибут __file__. Этот атрибут отсутствует у встроенных и замороженных модулей. Он указывает на коллективный файл библиотеки для динамически загружаемых модулей. (Деффект: это может быть относительный путь, сохраненный в .pic файле при компиляции. Если Вы манипулируете с текущим каталогом посредством os.chdir() или переместите .pic файл в другое место, значение может оказаться не корректным.)


13.3 Новые и скорректированные модули


  • Новый встроенный модуль 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 или не переопределено во время построения).


13.4 Конфигурация и инсталляция


  • 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, возникшее вследствие этой попытки, тихонько игнорируется.

[Назад][Содержание][Вперед]


Реклама на InfoCity

Яндекс цитирования



Финансы: форекс для тебя








1999-2009 © InfoCity.kiev.ua