Как я могу извлечь имена полей из строки формата Python (legacy)? - PullRequest
3 голосов
/ 26 февраля 2012

Я считаю, что это сложный вопрос для слов, отсюда и примеры.Тем не менее, мне в основном дают строки произвольного формата , и мне нужно (эффективно) получить соответствующие значения из базы данных, чтобы динамически построить соответствующий объект отображения.

Учитывая строку формата, ожидающую объект сопоставления, например:

>>> 'Hello, %(first-name)s!' % {'first-name': 'Dolph'}
'Hello, Dolph!'

Я ищу реализацию 'infer_field_names ()' ниже:

>>> infer_field_names('Hello, %(first-name)s! You are #%(customer-number)d.')
['first-name', 'customer-number']

Я знаю, что мог бы написать регулярное выражение(или даже попытаться разобрать сообщения об исключениях!), но я надеюсь, что есть существующий вызов API, который я могу использовать вместо этого? .. *

На основе строки Formatter docs , я подумалбудет работать:

>>> import string
>>> format_string = 'Hello, %(first-name)s! You are #%(customer-number)d.'
>>> [x[1] for x in string.Formatter().parse(format_string)]
[None]

Но это не совсем то, что я ожидал (список field_name с, согласно документам).

1 Ответ

6 голосов
/ 26 февраля 2012

При использовании оператора % для форматирования строк правый операнд не обязательно должен быть словарем - это должен быть только какой-то объект, отображающий требуемые имена полей в значения, которые должны быть замещены. Поэтому все, что вам нужно сделать, это написать класс с переопределенным __getitem__(), который извлекает значения из базы данных.

Вот бессмысленный пример:

class Mapper(object):
    def __getitem__(self, item):
        return item   

print 'Hello, %(first-name)s!' % Mapper()

печать

Hello, first-name!
...