programing

ConfigParser에서 사례를 유지하시겠습니까?

prostudy 2022. 3. 13. 11:03
반응형

ConfigParser에서 사례를 유지하시겠습니까?

나는 Python의 ConfigParser 모듈을 사용하여 설정을 저장하려고 시도했다.내 앱의 경우 내 섹션에 있는 각 이름의 케이스를 보존하는 것이 중요하다.문서에서는 configParser.optionxform()에 str()을 전달하면 이렇게 될 것이라고 언급하지만, 나에게는 효과가 없다.이름은 모두 소문자로 되어 있다.내가 뭘 빼놓았나요?

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

문서가 혼란스럽다.그들이 의미하는 것은 다음과 같다.

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

나는 이것을 버그로 보고했고, 그 이후로 고쳐졌다.

나는 설정하기 위해 노력했다.optionxform객체를 만든 직후

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)

이렇게 하면 설정하지 않아도 된다.optionxform새로운 것을 만들 때마다ConfigParser좀 지루한 것 같아

주의사항:

ConfigParser에서 기본값을 사용하는 경우, 예를 들어:

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

그리고 다음을 사용하여 파서를 대소문자를 구분하도록 하십시오.

config.optionxform = str

구성 파일의 모든 옵션은 해당 사례를 유지하지만FOO_BAZ소문자로 전환될 것이다.

기본값도 대소문자를 유지하려면 @cisetree 답변과 같은 하위 클래싱을 사용하십시오.

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

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

지금FOO_BAZ케이스가 유지되고 인터폴ationMissingOptionError가 발생하지 않을 겁니다.

참조URL: https://stackoverflow.com/questions/1611799/preserve-case-in-configparser

반응형