management cfg python design configuration-files

cfg - Teclas exclusivas ConfigParser de Python por sección



python import config (2)

Leí la parte de los documentos y vi que ConfigParser devuelve una lista de pares clave / valor para las opciones dentro de una sección. Pensé que las claves no necesitaban ser únicas dentro de una sección, de lo contrario, el analizador solo devolvería una asignación. Diseñé mi esquema de archivo de configuración alrededor de esta suposición, y tristemente me di cuenta de que este no es el caso:

>>> from ConfigParser import ConfigParser >>> from StringIO import StringIO >>> fh = StringIO(""" ... [Some Section] ... spam: eggs ... spam: ham ... """) >>> parser = ConfigParser() >>> parser.readfp(fh) >>> print parser.items(''Some Section'') [(''spam'', ''ham'')]

Luego volví y encontré la parte de los documentos que debería haber leído:

Las secciones se almacenan normalmente en un diccionario integrado. Se puede pasar un tipo de diccionario alternativo al constructor ConfigParser. Por ejemplo, si se pasa un tipo de diccionario que ordena sus claves, las secciones se ordenarán por reescritura, al igual que las claves dentro de cada sección.

Para mantener mi esquema de archivo de configuración existente (que realmente me gusta ahora), estoy pensando en pasar un objeto parecido a un mapeo como se mencionó anteriormente que acumula valores en lugar de atacarlos. ¿Hay alguna manera más simple de evitar el colapso de clave / valor que me falta? En lugar de hacer un adaptador loco (que podría romperse si la implementación de ConfigParser cambia) ¿debería simplemente escribir una variante de ConfigParser ?

Siento que este puede ser uno de esos momentos ''duh'' en los que solo veo las soluciones difíciles.

[Editar:] Aquí hay un ejemplo más preciso de cómo me gustaría usar la misma clave varias veces:

[Ignored Paths] ignore-extension: .swp ignore-filename: tags ignore-directory: bin

No me gusta la sintaxis de la lista delimitada por comas porque es difícil para los ojos cuando se escala a muchos valores; por ejemplo, una lista delimitada por comas de cincuenta extensiones no sería particularmente legible.


Esta deficiencia de ConfigParser es la razón por la cual pyglet usó la versión parcheada de epydoc para reemplazar ConfigParser ini con este formato simple :

name: pyglet url: http://www.pyglet.org/ output: html target: doc/api/ ... module: pyglet exclude: pyglet.gl.gl exclude: pyglet.gl.agl exclude: pyglet.gl.lib_agl exclude: pyglet.gl.wgl ...

Si no necesita secciones, este enfoque puede ser útil.


ConfigParser no está diseñado para manejar tales condiciones. Además, tu archivo de configuración no tiene sentido para mí.

ConfigParser le proporciona una estructura similar a un dictado para cada sección, por lo que cuando llame a parser.items (sección), espero una salida similar a dict.items (), que es solo una lista de tuplas de clave / valor. Nunca esperaría ver algo como:

[(''spam'', ''eggs''), (''spam'', ''ham'')]

Sin mencionar, ¿cómo esperarías que se comportara lo siguiente ?:

parser.get(''Some Section'', ''spam'')

¿Cuál es la forma prevista de recuperar valores?

Si desea almacenar múltiples valores para la misma clave, sugeriría algo como esto en su archivo de configuración:

[Some Section] spam: eggs, ham

Y esto en tu código:

spam_values = [v.strip() for v in parser.get(''Some Section'', ''spam'').split('','')]

Por supuesto, esto solo funcionará para los valores que no contienen comas o manejan las comillas. Para eso, debes emplear una técnica más avanzada (ver esto y esto ).

EDITAR: si no te importa la dependencia adicional, puedes echar un vistazo a ConfigObj , que de forma nativa admite listas como un tipo de valor.