Я попытался использовать модуль Python ConfigParser для сохранения настроек. Для моего приложения важно, чтобы я сохранял регистр каждого имени в моих разделах. В документах упоминается, что передача str () в ConfigParser.optionxform () сделает это, но для меня это не работает. Имена все в нижнем регистре. Я что-то упускаю?
<~/.myrc contents>
[rules]
Monkey = foo
Ferret = baz
Псевдокод Python того, что я получаю:
import ConfigParser,os
def get_config():
config = ConfigParser.ConfigParser()
config.optionxform(str())
try:
config.read(os.path.expanduser('~/.myrc'))
return config
except Exception, e:
log.error(e)
c = get_config()
print c.options('rules')
[('monkey', 'foo'), ('ferret', 'baz')]
Для меня работал, чтобы установить optionxform сразу после создания объекта
источник
ConfigParser.ConfigParser()
Добавьте в свой код:
config.optionxform = lambda option: option # preserve case for letters
источник
config.optionxform=str
:) только вместо вашей lamdba @Martin v. Löwis использует встроеннуюstr
функциюЯ знаю, что на этот вопрос есть ответ, но я подумал, что некоторые люди найдут это решение полезным. Это класс, который может легко заменить существующий класс ConfigParser.
Отредактировано с учетом предложения @OozeMeister:
class CaseConfigParser(ConfigParser): def optionxform(self, optionstr): return optionstr
Использование такое же, как и в обычном ConfigParser.
Это сделано для того, чтобы вам не приходилось устанавливать optionxform каждый раз, когда вы создаете новый
ConfigParser
, что довольно утомительно.источник
optionxform
это всего лишь методRawConfigParser
, если вы собираетесь создать собственный подкласс, вам следует вместо этого просто переопределить метод подкласса, а не переопределять его для каждого экземпляра:class CaseConfigParser(ConfigParser): def optionxform(self, optionstr): return optionstr
Предостережение:
Если вы используете настройки по умолчанию с ConfigParser, то есть:
config = ConfigParser.SafeConfigParser({'FOO_BAZ': 'bar'})
а затем попробуйте сделать синтаксический анализатор чувствительным к регистру, используя это:
все ваши параметры из конфигурационных файлов сохранят свой регистр, но
FOO_BAZ
будут преобразованы в нижний регистр.Чтобы значения по умолчанию также оставались неизменными, используйте подклассы, как в ответе @icedtrees:
class CaseConfigParser(ConfigParser.SafeConfigParser): def optionxform(self, optionstr): return optionstr config = CaseConfigParser({'FOO_BAZ': 'bar'})
Теперь
FOO_BAZ
оставим это дело, и у вас не будет InterpolationMissingOptionError .источник