2014-08-29 13 views
1

나는 ConfigObj를보고 있었고 유효성 검사 및 단일 요소 목록과 관련된 문제가 발생했습니다. 다음과 같은 구성 사양이 있다고 가정 해보십시오.ConfigObj 및 단일 요소 목록

config_specification = """[Data] 
    [[__many__]] 
    type = option('sense.xml') 
    transport = string 
    sensors = list 
     [[[Identifier]]] 
     type = option("name", "mac", "uuid") 
     adapter = string(default='') 
     name = string(default='') 
     file = string(default='')""" 

이 목록은 사실 하나의 요소 일 수도 있고 둘 이상의 요소 일 수도 있습니다. 나는 하나 이상을 쉽게 할 수있다 :

[Data] 
    [[primary]] 
    type = sense.xml 
    transport = $http 
    sensors = $virtual, $gpio, $adc 
     [[[Identifier]]] 
     type = name 
     name = VirtualRelay01 

그러나 다음은 유효하지 않다. 1의 목록으로 변환하지 않습니다 :

sensors = $virtual 

나는 두 가지 변형을 시도했습니다. 이 사람은

sensors = {$virtual} 

를 작동하지 어느 쪽이 하나를 수행하지 않습니다

sensors = [$virtual] 

를 그리고 이렇게하면, 그것은 나에게 두 가지 요소 목록을 제공! 빈 문자열 중 하나 :

sensors = ($virtual,) 

나는 이러한 섹션이 여러 개 있으며 for 루프가 있습니다. 목록을 취하는 클래스에만 적용하고 모든 특수 사례를 개별적으로 코딩하여 해당 목록 주위에 목록을 추가하고 싶지는 않습니다 (유효성 검사는 실패하지는 않습니다).

완성도를 들어, 여기에 내가 일을 확인하는 방법입니다

cfg = ConfigObj(filename, configspec=config_specification.split('\n')) 

test = cfg.validate(Validator()) 

valid = True 
for (section_list, key, _) in flatten_errors(cfg, test): 
    if key is not None: 
    print('Invalid value for key {0} in section {1}'.format(key,', '.join(section_list))) 
    valid = False 
    else: 
    print('Section {0} failed validation'.format(', '.join(section_list))) 
    valid = False 
if not valid: 
    exit(3) 

답변

3

나는 현재 configobj 개발자 중 하나입니다. 이 단위 테스트 line에 따르면, 나는 sensors = $virtual,이 기대했던대로 작동 할 것으로 기대합니다.

두 요소 목록을 반환하는 ($virtual,)에 대해 어떻게 생각하는지 모르겠습니다. 그것은 틀린 것처럼 보인다. 아마도 암시적인 빈 문자열을 원할 것으로 예상되는 시나리오를 상상할 수 없다면 문제를 열어 볼 가치가 있습니다.

0

the docs에 따르면, 어쨌든 원하는 문자열이면을 사용할 수 있으며 단일 요소 목록 끝에 이상한 쉼표가 필요하지 않을 수 있습니다.