Можно ли временно отключить интерполяцию строк в Python? - PullRequest
9 голосов
/ 29 марта 2010

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

Строка формата хранится в словаре настроек в отдельном файле, который обрабатывает чтение и запись файла конфигурации. У меня проблема в том, что python все еще пытается отформатировать файл и падает, когда он читает все специфичные для модуля логирования флаги форматирования.

{
    "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 (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

Ответы [ 6 ]

11 голосов
/ 29 марта 2010

Вы пытались избежать процентов с %%?

9 голосов
/ 29 марта 2010

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

EDIT:

На самом деле, используя 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"
}
5 голосов
/ 29 марта 2010

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

Подробнее см. Документацию RawConfigParser .

3 голосов
/ 02 марта 2017

Вы также можете использовать интерполяцию, установленную на None.

config = ConfigParser(strict=False, interpolation=None)

(я использую Python 3.6.0)

1 голос
/ 29 марта 2010

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

http://bugs.python.org/issue5741

1 голос
/ 29 марта 2010

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

...