[ главная ]   [ рейтинг статей ]   [ справочник радиолюбителя ]   [ новости мира ИТ ]



Ответов: 0
25-02-12 07:01







   Web - программирование
PHP


ASP






XML



CSS

SSI





   Программирование под ОС











   Web - технологии








   Базы Данных









   Графика






Данные




Web - программирование / Python /

Интерполяция строк

Все хорошо знают об операторе форматирования в языке Python. В этой заметке приводятся малоизвестные приемы его использования.

В самом простом способе применения оператора форматирования его поведение аналогично функций *printf в C:

>>> print 'Длина удава: %d попугаев и %d попугайское крылышко' % (38, 1)
Длина удава: 38 попугаев и 1 попугайское крылышко


При использовании '%s' или '%r' объекты любого типа автоматически преобразуются к строке, как если бы к ним применялась функция str или repr соответственно:

>>> print 'Длина удава: %s попугаев и %s попугайское крылышко' % (38, 1)
Длина удава: 38 попугаев и 1 попугайское крылышко


Для длинных строк с большим количеством параметров удобнее ссылаться на значения по имени. Это позволит менять порядок следования значений в строке не меняя правый аргумент оператора форматирования:

>>> args = {'parrots': 38, 'wings': 1}
>>> print '%(parrots)s попугаев и %(wings)s попугайское крылышко' % args
38 попугаев и 1 попугайское крылышко
>>> print '%(wings)s крылышко в добавок к %(parrots)s попугаям' % args
1 крылышко в добавок к 38 попугаям
>>> print '%(wings)s крылышко не в счет' % args
1 крылышко не в счет


Можно не составлять словарь самостоятельно, а использовать функцию globals, locals или vars:

>>> print '%(parrots)s попугаев и %(wings)s попугайское крылышко' % vars()
38 попугаев и 1 попугайское крылышко


Однако и это не все, что можно делать с оператором форматирования. Тем, кто знаком с языком perl, обычно сильно не достает интерполяции строк с выражениями, записанными непосредственно в строке-шаблоне. Аналогичный эффект можно получить и в языке Python с помощью простого классом, имитирующего поведение словаря:

class EvalDict:
    def __getitem__(self, key):
        return eval(key)


Использовать класс EvalDict можно аналогично функции vars:

>>> nums = [38, 1]
>>> print '%(nums[0])s попугаев и %(nums[1])s крылышко' % EvalDict()
38 попугаев и 1 крылышко


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

import sys

class EvalDict:

    def __init__(self, globals=None, locals=None):
        if globals is None:
            globals = sys._getframe(1).f_globals
        self.globals = globals
        if locals is None:
            locals = sys._getframe(1).f_locals
        self.locals = locals

    def __getitem__(self, key):
        key = key % self
        return eval(key, self.globals, self.locals)


Теперь определение класса можно спокойно вынести в отдельный модуль и использовать вложенные выражения:

>>> nums = [38, 1]
>>> units = ['
попугаев', 'крылышко']
>>> index = 0
>>> print '%(nums[index])d %(units[index])s' % EvalDict()
38
попугаев
>>> index = 1
>>> print '%(nums[index])d %(units[index))s' % EvalDict()
1
крылышко




Комментарии

 Ваш комментарий к данному материалу будет интересен нам и нашим читателям!



Последние статьи: Web - программирование / Python /

Текстовая обработка в языке Python. Подсказки для начинающих
19-03-2009   

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

Кол. просмотров: общее - 3399 сегодня - 0

Stackless Python
19-03-2009   

Вы хотите, чтобы ваш любимый язык был меньше, быстрее, гибче и надежнее? Эти цели и ставил перед собой разработчик Stackless Python... подробнее

Кол. просмотров: общее - 3321 сегодня - 0

Из опыта Web-мастера: переползаем на Python
19-03-2009   

Осенью прошлого года был запущен сайт www.iso.ru, разработанный компанией ADT. Движок сайта, представляющий собой набор CGI скриптов, был написан на Perl. По прошествии полугода эксплуатации возникла необходимость расширить функциональность сайта. Поэтому встал вопрос о выборе языка для написания скриптов... подробнее

Кол. просмотров: общее - 5701 сегодня - 0

Еще о функциональном программировании на Python
19-03-2009   

Эта статья продолжает серию статей о функциональном программирования (ФП) на Python. В ней демонстрируется несколько достаточно сложных концепций ФП. Читателю окажется полезным введение в различные подходы программного решения задач... подробнее

Кол. просмотров: общее - 3291 сегодня - 0

Python - основные концепции
19-03-2009   

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

Кол. просмотров: общее - 3328 сегодня - 0



  WWW.COMPROG.RU - 2009-2012 | Designed and Powered by Zaipov Renat | Projects