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

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

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

{
    "log_level":logging.debug,
    "log_name":"C:Templogfile.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:Python26libConfigParser.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 (или ведения журнала, если на то пошло).

спасибо заранее, Доминик!--3-->

6 ответов


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


возможно, вы захотите использовать 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"
}

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

см. документацию RawConfigParser для получения более подробной информации.


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

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

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


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


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

http://bugs.python.org/issue5741