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







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

 

Глава 12. Новое в версии 1.3


Эта глава описывает более новые добавления к языку и библиотеке Python.


12.1 Ключевые аргументы


Функции и методы, написанные на Python, могут быть вызваны с использованием ключевых аргументов в форме ключ = значение. Например, следующая функция:

def parrot(voltage, state=’a stiff’, action=’voom’, type=’Norvegian Blue’):
    print "-- This parrot wouldn’t", action,
    print "if you put", voltage, "Volts through it."
    print "-- Lovely plumage, the", type
    print "-- It's", state, "!"

может быть вызвана одним из следующих способов:

parrot(1000)
parrot(action = ‘VOOOOOM’, voltage = 1000000)
parrot(‘a thousand’, state = ‘pushing up the daisies’)
parrot(‘a million’, ‘bereft of life’, ‘jump’)

но следующие вызовы были бы ошибочны:

parrot()                     # отсутствует обязательный аргумент
parrot(voltage=5.0, ‘dead’)  # не ключевой аргумент следует за ключевым
parrot(11, voltage=220)      # дублирование значения аргумента
parrot(actor=’John Cleese’)  # неизвестный ключ

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

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

(Насколько мне известно, эти правила точно соответствуют используемым в Modula-3, даже если они осуществлены с совершенно другим смыслом. Это интернационально.)

Когда последний формальный параметр присутствует в виде **name, он получает словарь содержащий все ключевые аргументы, чьи ключи не соответствуют формальным параметрам. Это можно комбинировать с формальным параметром в форме *name, который получает тьюпл, содержащий позиционные параметры перед списком формальных параметров. (*name должен предшествовать **name.) К примеру, если мы определим функцию вроде этого:

def cheeseshop(kind, *arguments, **keywords):
    print "-- Do you have any", kind, "?"
    print "-- I'm sorry, we’re all out of", kind
    for arg in arguments: print arg
    print ‘-’*40
    for kw in keywords.keys(): print kw, ‘:’, keywords[kw]

Ее можно вызвать вот так:

cheeseshop(‘Limburger’, "It’s very runny, sir.",
           "It’s really very, VERY runny, sir.",
           client=’John Cleese’,
           shopkeeper=’Michael Palin’,
           sketch=’Cheese Shop Sketch’)

и, конечно, это напечатает:

-- Do you have any Limburger ?
-- I’m sorry, we’re all out of Limburger
It’s very runny, sir.
It’s really very, VERY runny, sir.
----------------------------------------
client : John Cleese
shopkeeper : Michael Palin
sketch : Cheese Shop Sketch

Последствия этого изменения включают:

  • Встроенная функция apply() теперь имеет необязательный третий аргумент - словарь, определяющий любой ключевой аргумент для передачи. Например,

     apply(parrot, (), {‘voltage’:20, ‘action’: ‘voomm’}) 
    эквивалентно
     parrot(voltage=20, action=’voomm’) 

  • Для функций и методов, определенных в модуле расширения (т.е. реализованном на С или С++) существует механизм получения словаря их ключевых аргументов. По умолчанию, такие функции не принимают ключевых аргументов, поскольку имена аргументов не доступны интерпретатору.

  • В процессе реализации ключевых аргументов, вызовы функций и, особенно, методов были значительно ускорены – для метода с десятью формальными параметрами, потери при вызове были уменьшены на половину; для функций с одним формальным параметром, потери были сокращены на треть.

  • Формат .pic файлов был изменен (снова).

  • Оператор access вышел из строя. Синтаксис все еще распознается, но для него не генерируется никакого кода. (Возникли некоторые неприятные взаимодействия с изменениями для ключевых аргументов, и я планирую отделаться от access с пользой для другого достижения.)


12.2 Изменения в инструментах для WWW и Internet


  • Модуль htmllib был переписан не совместимым образом. Новая версия значительно более полна (HTML 2.0 за исключением форм, но включая все определения ISO-8859-1), и проста в использовании. Произошли также небольшие изменения в sgmllib.

  • Был добавлен новый модуль formatter для использования с новым htmllib модулем.

  • Модули urllib и httplib были модифицированы таким образом, что они отвергают неизвестные типы URL и поддерживают аутентификацию. Для разбора заголовков они теперь используют mimetools.Message вместо rfc822.Message. Метод endrequest() был исключен из HTTP класса, поскольку он прерывал взаимодействие с некоторыми серверами.

  • Класс rfc822.Message приведен к виду, позволяющему передавать флаг, показывающий что файл не доступен для поиска.

  • Модуль ftplib был исправлен чтобы быть (надо надеяться) более прочным на Linux.

  • Несколько новых операций, дополнительно поддерживаемых серверами, были добавлены к nntplib: xover, xgtitle, xpath и date.


12.3 Другие изменения языка


  • Оператор raise теперь принимает необязательный аргумент, задающий строку (traceback) которая будет использована при печати исключением следа в стеке. Этот аргумент должен быть traceback-объектом, подобно sys.exc_traceback. В случае его отсутствия или равенства None, используется старое поведение (чтобы сгенерировать след в стеке для текущего стекового кадра).

  • Разборщик теперь более терпим к чуждым пробелам. Control-L, в ведущем пробеле строки, устанавливает номер столбца в ноль, тогда как Control-R, в самом конце строки, игнорируется.


12.4 Изменения во встроенных операциях


  • Для файловых объектов, f.read(0) и f.readline(0) возвращают пустую строку вместо того, чтобы читать неограниченное число байт. Для последнего опустите аргумент или передайте отрицательное значение.

  • Добавлена новая системная переменная sys.platform. Она определяет текущую платформу, например, sunos5 или linux1.

  • Встроенные функции input() и raw_input() теперь используют библиотеку GNU readline, если она сконфигурирована (прежде только интерактивный ввод самого интерпретатора считывался используя GNU readline). Библиотека GNU readline предоставляет сложное редактирование и историю строк. От этого в первую очередь выигрывает отладчик Python (pdb).

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

  • Встроенная функция compile() теперь принимает третье возможное значение для указания типа кода, который будет скомпилирован: определение 'single' генерирует код для простого интерактивного оператора, который печатает вывод выражения, в случае возможности его оценки как нечто кроме None.


12.5 Изменения в библиотеке


  • Появились новые модули ni и ihooks, которые поддерживают импортирование модулей иерархическими именами, такими как A.B.C. Это достигается записью import ni; ni.ni() на самом верху основной программы. Эти модули достаточно документированы в Python исходнике.

  • Был переписан модуль rexec (несовместимо), чтобы определить класс и использовать ihooks.

  • Функции string.split() и string.splitfields() - теперь одна и та же функция (наличие или отсутствие второго аргумента определяет какую операцию вызвать); аналогичная ситуация и с функциями string.join() и string.joinfields().

  • Модуль Tkinter и его справочник Dialog были переделаны с использованием ключевых аргументов. Tk 4.0 теперь является стандартом. Был добавлен новый модуль FileDialog, реализующий стандартный диалог выбора файла.

  • Дополнительные встроенные модули dbm и gdbm были согласованы - их функции open() теперь принимают одинаковые значения для свих аргументов flag, аргументы flag и mode имеют значения по умолчанию (открытие базы данных только для чтения и создание базы данных с режимом 0666 минус umask, рекурсивно). Утечка памяти наконец устранена.

  • Добавлен новый dbm-подобный модуль, bsddb, который использует хэш метод пакетов BSD DB.

  • Портативный (хотя и медленный) dbm-аналог, реализованный на Python, был добавлен для систем, на которых он отсутствовал. Это удачно продублированный dumbdbm.

  • Модуль anydbm предоставляет унифицированный интерфейс к bsddb, gdbm, dbm и dumbdbm, выбирая из них первый доступный.

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

  • Имеется три новых или переписанных родственных модуля, реализованных на Python, которые могут кодировать и декодировать в таких самых общих форматах: uu (uuencode), base64 и binhex.

  • Также добавлен модуль для оперирования с MIME кодированием: quopri.

  • Модуль разборщика (который предоставляет интерфейс к абстрактному синтаксическому дереву разборщика Python) был переписан (несовместимо) Фредом Дрэйком (Fred Drake). Это теперь позволяет Вам изменить дерево грамматического разбора и откомпилировать результат!

  • Модуль syslog был модернизирован и задокументирован.


12.6 Другие изменения


  • Динамический загрузчик модулей распознает тот факт, когда различные имена файлов указывают на одну и ту же коллективную библиотеку, и загружает библиотеку лишь однажды. Так что у Вас может быть единственная коллективная библиотека, определяющая несколько модулей. (Только на SunOS / SVR4.)

  • "Абстрактный объектный интерфейс" Джима Фултона (Jim Fulton) , был включен в run-time API. Детали описаны в файлах Include/abstract.h и Objects/abstract.c.

  • Macintosh версия теперь намного более прочная.

  • Многочисленные вещи я сам забыл, или они настолько затемнены, что никто их не заметит :-)

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


Реклама на InfoCity

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



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








1999-2009 © InfoCity.kiev.ua