Сохранять регистр в ConfigParser?

Я попытался использовать модуль ConfigParser Python для сохранения настроек. Для моего приложения важно сохранить случай каждого имени в моих разделах. В документах упоминается, что передача 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')] 

4 Solutions collect form web for “Сохранять регистр в ConfigParser?”

Документация запутанна. Что они означают, так это:

 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') 

Т.е. переопределить optionxform, вместо того, чтобы называть его; переопределение может выполняться в подклассе или в экземпляре. При переопределении установите его в функцию (а не результат вызова функции).

Я теперь сообщил об этом как об ошибке , и с тех пор она исправлена.

Для меня работала, чтобы установить optionxform сразу после создания объекта

 config = ConfigParser.RawConfigParser() config.optionxform = str 

Я знаю, на этот вопрос ответили, но я подумал, что некоторые люди могут найти это решение полезным. Это класс, который может легко заменить существующий класс ConfigParser.

Отредактировано для включения предложения @ OozeMeister:

 class CaseConfigParser(ConfigParser): def optionxform(self, optionstr): return optionstr 

Использование такое же, как у обычного ConfigParser.

 parser = CaseConfigParser() parser.read(something) 

Таким образом, вы избегаете устанавливать optionxform каждый раз, когда вы создаете новый ConfigParser , который является довольно утомительным.

Предостережение:

Если вы используете настройки по умолчанию с ConfigParser, то есть:

 config = ConfigParser.SafeConfigParser({'FOO_BAZ': 'bar'}) 

а затем попытайтесь сделать регистр с учетом регистра с помощью этого:

 config.optionxform = str 

все ваши параметры из файла конфигурации сохранят свое дело, но FOO_BAZ будет преобразован в нижний регистр.

Чтобы иметь значения по умолчанию, также сохраняют свой случай, используйте подкласс, как в @icedtrees, ответьте:

 class CaseConfigParser(ConfigParser.SafeConfigParser): def optionxform(self, optionstr): return optionstr config = CaseConfigParser({'FOO_BAZ': 'bar'}) 

Теперь FOO_BAZ сохранит это дело, и у вас не будет InterpolationMissingOptionError .

  • Почему 4 <'3' возвращает True в Python 2?
  • Как реализовать обратный вызов user_loader в Flask-Login
  • Печать строки печатает 'u' перед строкой в ​​Python?
  • Как я могу получить доступ к переменной класса в инициализаторе в Python?
  • Как документировать аргумент, который принимает несколько типов
  • Где Python сохраняет привязку имени закрытия функции?
  • Пользовательский порядок классов: нет ошибок, для чего требуется тестирование Python?
  • Что такое хороший питонический способ поиска дублирующих объектов?
  • Python - лучший язык программирования в мире.