Строка обрабатывает по шаблону в Python: что такое допустимые символы?

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

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 сделать то, что я хочу?

5
задан Peter Mortensen 18 April 2011 в 10:01
поделиться

3 ответа

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

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

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

5
ответ дан 13 December 2019 в 22:06
поделиться

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

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) ) работает.

4
ответ дан 13 December 2019 в 22:06
поделиться

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

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

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

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

и

«идентификатор» должны записывать идентификатор Python.

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

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

1
ответ дан 13 December 2019 в 22:06
поделиться
Другие вопросы по тегам:

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