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 respuestas
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.
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.
Preguntas relacionadas
Nuevas preguntas
python
Python es un lenguaje de programación multipropósito, de tipificación dinámica y de múltiples paradigmas. Está diseñado para ser rápido de aprender, comprender y usar, y hacer cumplir una sintaxis limpia y uniforme. Tenga en cuenta que Python 2 está oficialmente fuera de soporte a partir del 01-01-2020. Aún así, para preguntas de Python específicas de la versión, agregue la etiqueta [python-2.7] o [python-3.x]. Cuando utilice una variante de Python (por ejemplo, Jython, PyPy) o una biblioteca (por ejemplo, Pandas y NumPy), inclúyala en las etiquetas.