ConfigParser에서 대소 문자를 유지 하시겠습니까?


90

Python의 ConfigParser 모듈을 사용하여 설정을 저장 하려고했습니다 . 내 앱의 경우 섹션에서 각 이름의 대소 문자를 유지하는 것이 중요합니다. 문서에서는 str ()을 ConfigParser.optionxform ()에 전달 하면이를 수행 할 수 있다고 언급 하지만 저에게는 작동하지 않습니다. 이름은 모두 소문자입니다. 내가 뭔가를 놓치고 있습니까?

<~/.myrc contents>
[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')
[('monkey', 'foo'), ('ferret', 'baz')]

답변:


114

설명서가 혼란 스럽습니다. 이것이 의미하는 바는 다음과 같습니다.

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을 호출하는 대신 재정의합니다. 재정의는 하위 클래스 또는 인스턴스에서 수행 할 수 있습니다. 재정의 할 때 함수를 호출 한 결과가 아닌 함수로 설정합니다.

이제 이것을 버그로 보고 했으며 이후 수정되었습니다.


감사합니다. 작동하며 문서가 혼란 스럽다는 데 동의합니다.
pojo

39

나를 위해 객체를 생성 한 직후 optionxform을 설정했습니다.

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

2
잘 작동합니다! (주 파이썬 3에서인지 "configparser"클래스 이름 (더 대문자 없음)
노암 마 노스

1
@NoamManos : 모듈 이름을 참조하고 있습니다 (클래스 이름은 여전히 ConfigParser입니다 ).
Jonas Byström

2
그것으로도 작동합니다ConfigParser.ConfigParser()
장 - 프랑소와 T.

과연. 효과가있다. 이 매개 변수는 ConfigParser () 클래스와 함께 지원되기 때문에 기본적으로 RawConfigParser ()와 관련이 없습니다. 고마워요.
ivanleoncz

7

코드에 추가 :

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

1
이것은 적어도 파이썬 2.7에서 나를 위해 작동하는 것으로 보이며 허용되는 답변보다 훨씬 깨끗합니다. 감사합니다 foo!
hrbdg 2010 년

2
이것은 최고 점수를받은 답변과 동일합니다-줄 참조 config.optionxform=str:) lamdba 대신 @Martin v. Löwis는 임베디드 str기능을 사용 합니다
xuthus

@xuthus-실제로 한 줄 대신 11 줄의 코드를 사용할 수 있습니다. 원하는대로.
FooBar167

4

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

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

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

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

parser = CaseConfigParser()
parser.read(something)

이것은 당신이 새로운을 만들 때마다 optionxform을 설정할 필요가 없도록하기 위해서 ConfigParser입니다. 이것은 일종의 지루한 일입니다.


이후 optionxform온 다만 방법은 RawConfigParser당신이 지금까지 자신의 서브 클래스를 만드는 등 갈 거라면, 당신은 대신 오히려 인스턴스 당을 재정의보다 서브 클래스에서 메소드를 오버라이드 (override) :class CaseConfigParser(ConfigParser): def optionxform(self, optionstr): return optionstr
OozeMeister

@OozeMeister 좋은 아이디어!
icedtrees 2015-06-10

2

경고:

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 가 발생하지 않습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.