Как избежать знака% в значении configobj? - PullRequest
11 голосов
/ 28 октября 2010

Я бы хотел использовать интерполяцию времени разбора и времени выполнения для значений файла конфигурации configobj . Самый простой способ выполнить простую интерполяцию строк в Python - это "%(foo)s" % somedict. К сожалению, configobj использует тот же механизм интерполяции, и я пока не нашел способа избежать его. В идеале моя ценность будет выглядеть так:

othervar = foo
someconfigobjkey = %(othervar)s %%(runtimevar)s

Однако configobj пытается (и не может) заменить вторую переменную. Другой способ ответить на этот вопрос - предоставить другой (configobj) способ для выполнения как разбора времени, так и времени выполнения.

Ответы [ 5 ]

10 голосов
/ 07 июля 2015

С момента публикации этого вопроса все могло измениться, но я обнаружил, что вы можете сбежать, используя символ% Это сработало для меня в Python 3.

В моем файле config.ini:

[LOGGING]
format = %%(asctime)-15s %%(message)s

В моем файле сценария python:

import configparser

# Load configuration
config = configparser.ConfigParser()
config.read("config.ini")

log_config = config['LOGGING']

print(log_config['format']) # prints out '%(asctime)-15s %(message)s'

Надеюсь, это поможет кому-то в будущем (:

4 голосов
/ 28 октября 2010

Да, к сожалению, configobj не следует обычным стандартным правилам форматирования Python, поэтому %%, который в противном случае был бы правильным способом избежать знака процента, завершился неудачей. Похоже, что-то вроде дизайнерского изъяна.

Единственный способ, которым я могу представить буквальную последовательность %(foo)s в значении configobj, - убедиться, что часть этой последовательности сама генерируется заменой:

>>> import configobj
>>> c= configobject.ConfigObj()
>>> c['foo']= 'bar'
>>> c['pc']= '%'
>>> c['v']= '%(foo)s %(pc)s(foo)s'
>>> c['v']
'bar %(foo)s'
3 голосов
/ 10 февраля 2013

Попробуйте использовать '%' + '(foo) s'. Это сработало для меня при работе с ConfigParser.

2 голосов
/ 28 октября 2010

Копаясь глубже в документации, я нашел решение, которое подходит лучше, чем предложенное bobince: используйте другой механизм интерполяции, например interpolation="template". У него есть два преимущества.

  1. Не мешает знакам%.
  2. Поддерживает побег. ($$ интерполируется до $.)

Пример будет выглядеть так:

othervar = foo
someconfigobjkey = $othervar %(runtimevar)s
1 голос
/ 28 октября 2010

Новая версия ответа:

Вы можете использовать "" .format () (Python 2.6 или выше) или string.Template (Python 2.4 или выше) для интерполяции во время выполнения - оба из которых будутустранить конфликт.

(Старая версия предполагала использование стандартного модуля ConfigParser, отсюда и комментарии.)

...