Сохранять регистр в 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')]
Ответы
Ответ 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.