2009-10-23 5 views
54

파이썬의 ConfigParser 모듈을 사용하여 설정을 저장하려고했습니다. 내 응용 프로그램의 경우 내 섹션의 각 이름의 대소 문자를 보존해야합니다. 문서는 ConfigParser.optionxform()에 str()을 전달하면이 작업을 수행 할 수 있다고 나와 있지만 작동하지 않습니다. 이름은 모두 소문자입니다. 내가 놓친 게 있니? 내가 무엇을 얻을의ConfigParser에서 대소 문자를 보존 하시겠습니까?

<~/.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')] 

답변

73

문서는 혼란 스럽다. 그 의미는 다음과 같습니다.

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을 호출하는 대신에 무시하십시오. 서브 클래스 또는 인스턴스에서 재정의를 수행 할 수 있습니다. 재정의 할 때는 함수를 호출하여 함수를 호출하십시오.

지금은 this as a bug으로보고되었으며 이후 수정되었습니다.

+0

고맙습니다. 작동하며, 문서가 혼란 스럽다는 것에 동의합니다. – pojo

+4

버그를보고 해 주신 분 – Tshepang

2

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

편집

는 @의 OozeMeister의 제안을 포함합니다 :

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

사용이 정상 ConfigParser과 동일합니다.

parser = CaseConfigParser() 
parser.read(something) 

이것은 당신이 가지 지루 새 ConfigParser을 할 때마다, optionxform 설정하는 것을 피하기 때문에입니다. 나를 위해

+0

'optionxform'은'RawConfigParser'에있는 메소드 일 뿐이므로, 자신 만의 서브 클래스를 만드는 것으로 가려면, 다시 정의하지 말고 서브 클래스에서 메소드를 오버라이드해야합니다 인스턴스화 당 :'클래스 CaseConfigParser (ConfigParser) : def optionxform (self, optionstr) : return optionstr' – OozeMeister

+0

@OozeMeister 좋은 생각! – icedtrees

20

개체를 생성 한 후 즉시 optionxform 설정하기 위해 노력

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

위대한 작품! (파이썬 3에서는 configparser 클래스 이름 (대문자 없음) –

+0

@NoamManos : 모듈 이름을 참조하고 있습니다 (클래스 이름은 여전히 ​​[ConfigParser] (https://docs.python.org/3/)입니다. 라이브러리/configparser.html # configparser.ConfigParser)). –

+0

'ConfigParser.ConfigParser()'와 함께 작동한다는 것에주의하십시오. –

0

경고 :

당신이 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 이 없습니다.