문제

나는 파이썬을 사용하려고 노력했다 configparser 설정을 저장하기위한 모듈. 내 앱의 경우 섹션에서 각 이름의 경우를 보존하는 것이 중요합니다. 문서는 str ()를 전달하는 것을 언급합니다 configparser.optionxform () 이것을 달성 할 것이지만 그것은 나에게는 효과가 없습니다. 이름은 모두 소문자입니다. 내가 뭔가를 놓치고 있습니까?

<~/.myrc contents>
[rules]
Monkey = foo
Ferret = baz

내가 얻는 것의 Python pseudocode :

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')]
도움이 되었습니까?

해결책

문서가 혼란 스럽습니다. 그들이 의미하는 바는 다음과 같습니다.

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

즉, 옵션 XFORM을 호출하는 대신 재정의합니다. 오버링은 서브 클래스 또는 인스턴스에서 수행 할 수 있습니다. 재정의 할 때 (함수를 호출 한 결과가 아닌) 함수로 설정하십시오.

나는 지금보고했다 이것은 버그로서, 그리고 그 이후로 고정되었습니다.

다른 팁

객체를 만든 직후 옵션 XFORM을 설정하기 위해 노력했습니다.

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

코드 추가 :

config.optionxform = lambda option: option  # preserve case for letters

이 질문에 대한 답변이 있다는 것을 알고 있지만 일부 사람들은이 솔루션이 유용하다고 생각했습니다. 이것은 기존 configparser 클래스를 쉽게 대체 할 수있는 클래스입니다.

@oozemeister의 제안을 통합하도록 편집 :

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

사용법은 일반 configparser와 동일합니다.

parser = CaseConfigParser()
parser.read(something)

이것은 당신이 새로운 것을 만들 때마다 옵션 xform을 설정하지 않아도됩니다. ConfigParser, 그것은 지루한 것입니다.

경고:

configparser와 함께 기본값을 사용하는 경우, 즉 :

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

그런 다음 파서를 사용하여 파서의 대사에 민감하게 만듭니다.

config.optionxform = str

구성 파일의 모든 옵션은 사례를 유지하지만 FOO_BAZ 소문자로 변환됩니다.

기본값도 사례를 유지하려면 @sidttrees에서와 같이 서브 클래싱을 사용하십시오.

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

config = CaseConfigParser({'FOO_BAZ': 'bar'})

지금 FOO_BAZ 케이스를 유지하고 당신은 가지 않을 것입니다 보간 missingoptionerror.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top