Строковые шаблоны в Python: что такое допустимые символы? - PullRequest
5 голосов
/ 24 февраля 2010

Я не могу понять, что происходит с шаблонами строк :

t = Template('cannot teach an ${dog.old} ${tricks.new}. ${why} is this ${not} working')
print t.safe_substitute({'dog.old': 'old dog', 'tricks.new': 'new tricks', 'why': 'OH WHY', 'not': '@#%@#% NOT'})

Это печатает:

cannot teach an ${dog.old} ${tricks.new}. OH WHY is this @#%@#% NOT working

Я думал, что фигурные скобки обрабатывают произвольные строки. Какие символы разрешены в фигурных скобках, и есть ли способ подкласса Template делать то, что я хочу?

Ответы [ 3 ]

5 голосов
/ 24 февраля 2010

Из документации ...

$ identifier именует замещающий заполнитель, соответствующий ключу сопоставления «identifier». По умолчанию «идентификатор» должен содержать идентификатор Python. Первый неидентифицирующий символ после символа $ завершает эту спецификацию заполнителя.

Точка не является идентификатором, а фигурные скобки просто используются для отделения идентификатора от смежного текста без идентификатора.

4 голосов
/ 24 февраля 2010

Ага, я попробовал этот эксперимент:

from string import Template
import uuid

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

t1 = Template('cannot teach an ${dog.old} ${tricks.new}. ${why} is this ${not} working')
t2 = MyTemplate('cannot teach an ${dog.old} ${tricks.new}. ${why} is this ${not} working')
map1 = {'dog.old': 'old dog', 
    'tricks.new': 'new tricks', 'why': 'OH WHY', 'not': '@#%@#% NOT'}
map2 = {'dog': {'old': 'old dog'}, 
        'tricks': {'new': 'new tricks'}, 'why': 'OH WHY', 'not': '@#%@#% NOT'}  
print t1.safe_substitute(map1)
print t1.safe_substitute(map2)
print t2.safe_substitute(map1)
print t2.safe_substitute(map2)

который печатает

cannot teach an ${dog.old} ${tricks.new}. OH WHY is this @#%@#% NOT working
cannot teach an ${dog.old} ${tricks.new}. OH WHY is this @#%@#% NOT working
cannot teach an old dog new tricks. OH WHY is this @#%@#% NOT working
cannot teach an ${dog.old} ${tricks.new}. OH WHY is this @#%@#% NOT working

так что третий (print t2.safe_substitute(map1)) работает.

1 голос
/ 24 февраля 2010

Python интерпретирует . в вашем имени как "доступ к полю old экземпляра dog". Попробуйте вместо этого _ или создайте dog объект с полем old.

AFAIR, между скобками безопасны только допустимые идентификаторы и ..

[РЕДАКТИРОВАТЬ] Это на странице, где вы ссылаетесь на:

${identifier} эквивалентно $identifier. Требуется, когда действительные идентификаторы следуют за заполнителем, но не являются частью заполнителя, например "${noun}ification".

и

"identifier" должен записать идентификатор Python.

, что означает: Это должен быть действительный идентификатор.

[EDIT2] Кажется, идентификатор не анализируется, как я думал. Таким образом, вы должны указать простой допустимый идентификатор Python в фигурных скобках (и вы не можете использовать синтаксис полевого метода доступа), если вы не создадите собственную реализацию шаблона класса .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...