He estado mirando ConfigObj y me he encontrado con un problema con la validación y las listas de elementos individuales. Digamos que tengo una especificación de configuración similar a la siguiente:

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='')"""

Ahora esa lista en realidad puede ser solo un elemento, o más de uno. Puedo hacer más de uno fácilmente:

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

Pero lo siguiente no es válido. No lo convertirá en una lista de 1:

sensors = $virtual

He intentado un par de variaciones. Este no funciona

sensors = {$virtual}

Tampoco este:

sensors = [$virtual]

Y si hago esto, ¡me da una lista con dos elementos! Uno la cadena vacía:

sensors = ($virtual,)

Tengo varias de estas secciones y las tengo en un bucle for. Los aplico a clases que solo toman listas y no quiero tener que codificar individualmente todos los casos especiales para agregar una lista alrededor de ellos (sin mencionar que falla la validación).

Para completar, así es como valido las cosas:

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)
2
djsumdog 29 ago. 2014 a las 08:11

2 respuestas

La mejor respuesta

Soy uno de los desarrolladores actuales de configobj. De acuerdo con esta prueba de unidad línea, esperaría sensors = $virtual, para trabajar de la manera que esperabas.

No estoy seguro de cómo me siento acerca de ($virtual,) devolver una lista de dos elementos. Eso parece mal. Probablemente valga la pena abrir un problema a menos que puedas imaginar un escenario en el que realmente anticipas querer la cadena vacía implícita.

4
Rob Dennis 29 ago. 2014 a las 13:33

De acuerdo con los documentos, si es una cadena que desea de todos modos, para su especificación de configuración, puede usar sensors = force_list() y luego no necesitará la coma extraña al final de la lista de elementos individuales.

1
Isaac 14 may. 2015 a las 17:32