Действительно ли возможно временно отключить строковую интерполяцию Python?

Мне настраивали регистратор Python, с помощью модуля входа Python. Я хочу сохранить строку, которую я использую с регистрирующимся объектом Средства форматирования в конфигурационном файле с помощью модуля ConfigParser.

Строка формата хранится в словаре настроек в отдельном файле, который обрабатывает чтение и запись файла конфигурации. Проблема, которую я имею, состоит в том, что Python все еще пытается отформатировать файл и падает, когда он читает весь logging-module-specific форматирующие флаги.

{
    "log_level":logging.debug,
    "log_name":"C:\\Temp\\logfile.log",
    "format_string":
        "%(asctime)s %(levelname)s: %(module)s, line %(lineno)d - %(message)s"
}

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

Я должен также упомянуть, так как это было скуплено в комментариях, что ConfigParser делает некоторую внутреннюю интерполяцию, которая вызывает прохождение. Вот мой traceback:

Traceback (most recent call last):
  File "initialconfig.py", line 52, in <module>
    "%(asctime)s %(levelname)s: %(module)s, line %(lineno)d - %(message)s"
  File "initialconfig.py", line 31, in add_settings
    self.set(section_name, setting_name, default_value)
  File "C:\Python26\lib\ConfigParser.py", line 668, in set
    "position %d" % (value, m.start()))
ValueError: invalid interpolation syntax in '%(asctime)s %(levelname)s: %(module
)s, line %(lineno)d - %(message)s' at position 10

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

Заранее спасибо, Dominic

12
задан dangerouslyfacetious 29 March 2010 в 13:11
поделиться

5 ответов

Вы пытались экранировать проценты с помощью %% ?

12
ответ дан 2 December 2019 в 04:02
поделиться

Вы можете использовать ConfigParser.RawConfigParser вместо ConfigParser.ConfigParser . Только последний выполняет волшебную интерполяцию значений конфигурации.

РЕДАКТИРОВАТЬ:

На самом деле, используя ConfigParser.SafeConfigParser , вы сможете экранировать строки формата с дополнительным знаком процента % . Этот пример должен работать тогда:

{
    "log_level":logging.debug,
    "log_name":"C:\\Temp\\logfile.log",
    "format_string":
        "%%(asctime)s %%(levelname)s: %%(module)s, line %%(lineno)d - %%(message)s"
}
10
ответ дан 2 December 2019 в 04:02
поделиться

В чем проблема с приведенным выше кодом? Интерполяция выполняется только в том случае, если к строке применяется оператор % . Если вы не используете % , вы можете использовать строку форматирования как любую другую строку.

1
ответ дан 2 December 2019 в 04:02
поделиться

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

Дополнительные сведения см. В документации RawConfigParser .

5
ответ дан 2 December 2019 в 04:02
поделиться

Какую версию Python вы используете? Обновление до 2.6.4 может помочь, см.

http://bugs.python.org/issue5741

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

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