2013-01-15 3 views
1

나는 ConfigObj 및 Validator를 사용하여 파이썬의 구성 파일을 구문 분석합니다. 나는이 도구를 많이 좋아하지만 configSpec 파일을 사용하여 유효성 검사에 문제가 있습니다.ConfigObj 옵션 유효성 확인

output_mode = option("Verbose", "Terse", "Silent") 

나는 사용자가 CV에없는 옵션을 입력하면 내 코드를 알고 싶어 : 나는 값이 통제 어휘 선택하는 강제 옵션() configSpec 유형을 사용하고 있습니다. 내가 무엇을 좋아해야하는 것은, 검사기는이 실패한 이유를 유효성 검증에 실패,하지만 어떤 설정 키 말 보인다에서 :

from configobj import ConfigObj, flatten_errors 
from validate import Validator 

config = ConfigObj('config.ini', configspec='configspec.ini') 
validator = Validator() 
results = config.validate(validator) 

if results != True: 
    for (section_list, key, _) in flatten_errors(config, results): 
     if key is not None: 
      print 'The "%s" key in the section "%s" failed validation' % (key, ', '.join(section_list)) 
     else: 
      print 'The following section was missing:%s ' % ', '.join(section_list) 

그 코드가 작동을하지만, 키가 검증에 실패한 이유 이유로 수에서,있다 CV에없는 정수 범위에 있지 않습니다. 나는 키 이름을 조사하고 그 키의 실패 사례에 따라 다른 종류의 예외를 제기 할 필요가 없다. 특정 유형의 유효성 검증 오류를 처리하는 더 명확한 방법이 있습니까?

긴 시간에 유래 리더, 처음으로 포스터

+0

이 예를 보았습니까? http://configobj.readthedocs.org/en/latest/configobj.html#flatten-errors? 오류 항목에 메시지가있는 것 같지만 아직 유용하지 않은 것 같습니다. –

답변

1

업데이트 :-) :이 내가 원하는 것을 수행 생각합니다. 핵심은 config obj가 오류를 Exception으로 저장하고 ValidateError 하위 클래스를 검사 할 수 있다는 것입니다. 그런 다음 매개 변수 값 당 하나의 검사보다는 하위 클래스 당 하나의 검사 만 수행하면됩니다. 유효성 검사가 실패하면 예외가 발생하지만 다른 기능은 잃을 수도 있습니다.

self.config = configobj.ConfigObj(configFile, configspec=self.getConfigSpecFile()) 
validator = Validator() 
results = self.config.validate(validator, preserve_errors=True) 

for entry in flatten_errors(self.config, results): 

    [sectionList, key, error] = entry 
    if error == False: 
     msg = "The parameter %s was not in the config file\n" % key 
     msg += "Please check to make sure this parameter is present and there are no mis-spellings." 
     raise ConfigException(msg) 

    if key is not None: 
     if isinstance(error, VdtValueError): 
     optionString = self.config.configspec[key] 
     msg = "The parameter %s was set to %s which is not one of the allowed values\n" % (key, self.config[key]) 
     msg += "Please set the value to be in %s" % optionString 
     raise ConfigException(msg) 

OptionString은 '당신이)가있는 문자열을 (잡아 할 필요가 있으므로이 좋은 볼을 얻기 위해 단지 형태 옵션 ("옵션 1", "옵션 2")의 문자열이 아닌 목록입니다 에스.

+0

귀하의 예는 완벽하지만 일부 수입 라인이 부족합니다. 필요한 항목 : validate 가져 오기에서 VdtValueError 그리고 여전히 ConfigException의 위치를 ​​찾으려고합니다. – Autiwa