Пример разделения на подклассы строки. Шаблон в Python?

typedef typename Tail::inUnion dummy;

Однако я не уверен, что Вы - реализация inUnion, корректно. Если я понимаю правильно, этот класс, как предполагается, не инстанцируют, поэтому вкладка "сбоя" никогда не будет avtually сбои. Возможно, было бы лучше, указывает, является ли тип в объединении или не с простым булевым значением.

template  struct Contains;

template 
struct Contains >
{
    enum { result = Contains::result };
};

template 
struct Contains >
{
    enum { result = true };
};

template 
struct Contains
{
    enum { result = false };
};

пз: Взгляните на Повышение:: Вариант

PS2: Взгляните на списки типов , особенно в книге Andrei Alexandrescu: современный Дизайн

C++

15
задан Josh Gibson 26 August 2009 в 18:54
поделиться

1 ответ

Из python docs :

Расширенное использование: вы можете получить подклассы шаблона для настройки синтаксис заполнителя, разделитель персонаж или весь обычный выражение, используемое для анализа шаблона струны. Для этого вы можете переопределить эти атрибуты класса:

  • разделитель - это буквальная строка, описывающая заполнитель вводим разделитель. По умолчанию значение $. Обратите внимание, что это не должно быть регулярное выражение, как реализация вызовет re.escape () в этой строке по мере необходимости.

  • idpattern - это регулярное выражение, описывающее шаблон для заполнители без фигурных скобок (фигурные скобки будет добавлен автоматически как подходящее). Значение по умолчанию - регулярное выражение [_a-z] [_ a-z0-9] *.

Пример:

from string import Template

class MyTemplate(Template):
    delimiter = '#'
    idpattern = r'[a-z][_a-z0-9]*'

>>> s = MyTemplate('#who likes $what')
>>> s.substitute(who='tim', what='kung pao')
'tim likes $what'

В python 3:

Новое в версии 3.2.

В качестве альтернативы вы можете предоставить весь шаблон регулярного выражения путем переопределения шаблона атрибута класса. Если вы сделаете это, значение должен быть объектом регулярного выражения с четырьмя именованными группами захвата. Группы захвата соответствуют правилам, приведенным выше, а также неправильное правило заполнителя:

  • экранированный - Эта группа соответствует управляющей последовательности, например $$, в шаблоне по умолчанию.
  • named - Эта группа соответствует имени свободного заполнителя; он не должен включать разделитель в группу захвата.
  • фигурные скобки - эта группа соответствует имени заполнителя, заключенному в фигурные скобки; он не должен содержать ни разделителя, ни фигурных скобок в захвате group.
  • недопустимый - эта группа соответствует любому другому шаблону разделителя (обычно с одним разделителем) и должна появляться последней в обычном выражение.

Пример:

from string import Template
import re

class TemplateClone(Template):
    delimiter = '$'
    pattern = r'''
    \$(?:
      (?P<escaped>\$) |   # Escape sequence of two delimiters
      (?P<named>[_a-z][_a-z0-9]*)      |   # delimiter and a Python identifier
      {(?P<braced>[_a-z][_a-z0-9]*)}   |   # delimiter and a braced identifier
      (?P<invalid>)              # Other ill-formed delimiter exprs
    )
    '''

class TemplateAlternative(Template):
    delimiter = '[-'
    pattern = r'''
    \[-(?:
       (?P<escaped>-) |            # Expression [-- will become [-
       (?P<named>[^\[\]\n-]+)-\] | # -, [, ], and \n can't be used in names
       \b\B(?P<braced>) |          # Braced names disabled
       (?P<invalid>)               #
    )
    '''

>>> t = TemplateClone("$hi sir")
>>> t.substitute({"hi": "hello"})
'hello sir'

>>> ta = TemplateAlternative("[-hi-] sir")
>>> ta.substitute({"hi": "have a nice day"})
'have a nice day sir'
>>> ta = TemplateAlternative("[--[-hi-]-]")
>>> ta.substitute({"hi": "have a nice day"})
'[-have a nice day-]'

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

25
ответ дан 1 December 2019 в 02:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: