Подтвердить что ты не робот

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

Я попытался использовать 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')]
4b9b3361

Ответ 1

Документация путается. Они имеют в виду следующее:

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, а не вызвать его; переопределение может выполняться в подклассе или в экземпляре. При переопределении установите его в функцию (а не результат вызова функции).

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

Ответ 2

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

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

Ответ 3

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

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

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

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

parser = CaseConfigParser()
parser.read(something)

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

Ответ 4

Протест:

Если вы используете настройки по умолчанию с 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.