Обнаружение% s, смешанного с именованными заполнителями в интерполяции Python - PullRequest
2 голосов
/ 10 января 2012

Так что, видимо, Python позволит

'%s %(var)s' % {'var': 'x'}

, который производит

"{'var': 'x'} x"

Я пишу что-то, где я в основном хочу использовать только функции замены заполненных имен в именах Python. Есть ли способ обнаружить сочетание именованных и позиционных заполнителей?

РЕДАКТИРОВАТЬ : В контексте этого я пишу что-то вроде шаблонного инструмента. После того, как вы напишите повсюду с% (named), вы вызываете template.substitute (dict) и заменяете все. Я пытаюсь предотвратить случай, когда люди оставляют %[srfd,etc] в строке (потому что они забыли интерполировать или что-то), выдавая ошибку, если она там оставлена.

Ответы [ 3 ]

4 голосов
/ 10 января 2012

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

Однако вы можете использовать регулярное выражение, чтобы найти позиционные заполнители и экранировать их до интерполяции строк:

>>> d = {'var': 'x'}
>>> template = '%s %(var)s'
>>> esc_template = re.sub(r'(%[^()]*[sdf])', r'%\1', template)
>>> esc_template % d
'%s x'
2 голосов
/ 10 января 2012

Не опция мгновенного исправления, но расширение комментария агандера, использование str.format по крайней мере гарантирует, что вы не заполнили случайно неназванные заполнители без появления ошибки.Это потому, что он отделяет позиционные замены от именованных с помощью правильного синтаксиса вызова метода:

>>> '%s %(var)s' % {'var': 'x'}
"{'var': 'x'} x"
>>> '{} {var}'.format(var='x')

Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    '{} {var}'.format(var='x')
IndexError: tuple index out of range
>>> '{} {var}'.format(8, var='x')
'8 x'

Есть дополнительное преимущество, которое я использую довольно часто, чтобы Python поддерживал два различных синтаксиса заменыХотя это немного злоупотребление фавритом.Так как я пишу много кода, который собирает запросы SQL для передачи в интерфейс БД, который использует %s для заполнителей для параметризованных запросов, я выполняю все мои вставки запросов внешнего уровня с str.format, что оставляет заполнители %sполностью беспокоящийся без необходимости постоянно избегать их.

>>> '%s {var}'.format(var='x')
'%s x'

Если по этой причине у вас есть %s s, которые, как вы ожидаете, пройдут в вашем выводе, str.format может значительно упростить вашу жизнь.

2 голосов
/ 10 января 2012

Если Рэймонд Хеттингер говорит вам, как это делается, вы слушаете, потому что он прав:)

Другой вариант - создать подкласс string.Template, чтобы определить собственную логику и синтаксис подстановки.

...