나는 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)