2010-10-12 10 views
6

que he visto personas utilizan mono-parches para configurar las opciones de un módulo, por ejemplo:Python: ¿Cuál es la forma recomendada de establecer las configuraciones de un módulo cuando lo importa?

importación mimodulo
mymodule.default_img = "/my/file.png"
mimodulo .view_default_img()

y Django, por ejemplo, tiene settings.py para toda la aplicación de Django, y siempre me irrita un poco.

¿Cuáles son las otras formas de administrar las configuraciones en un módulo? ¿Qué se recomienda? Parece que a menudo no hay una forma agradable de configurar la configuración a nivel de módulo.

Obviamente, evitar por completo la configuración es de lejos la más preferible, y generalmente es mejor usar clases o pasar el argumento a una función. Pero a veces no puede evitar tener configuraciones de algún tipo, y a veces tiene sentido tener configuraciones globales de todo el módulo solo por conveniencia (por ejemplo, el sistema de plantillas de Django - tener que especificar la ruta base para cada plantilla sería una pesadilla, definitivamente no es un buen código DRY).

Respuesta

3

Una opción es el módulo ConfigParser. Puede tener la configuración en un archivo de configuración que no sea python y que cada módulo lea su configuración de eso. Otra opción es tener un método de configuración en cada módulo para que el código del cliente pueda pasar sus argumentos también.

# foo.py 
setting1 = 0 
setting2 = 'foo' 

def configure(config1, config2): 
    global setting1, setting2 

    setting1 = config1 
    setting2 = config2 

Luego, en el módulo de importación,

import foo 

foo.configure(42, 'bar') 

Personalmente, creo que la mejor manera de hacerlo es con el archivo de configuración como Django.

+0

Personalmente, creo que la peor forma de hacerlo es con un archivo de configuración como django. Pero +1 por mencionar ConfigParser. –

+2

En realidad, probablemente no expresé mi pregunta muy bien. Cuando dije "configuración de configuración para un módulo" quise decir dentro de Python. Entonces, quizás una pregunta mejor: cuando importas un módulo, ¿cuál es la mejor manera de configurar el estado/parámetros a nivel de módulo en tiempo de ejecución, dentro de Python? Por ejemplo, cuando crea una instancia de una clase, una forma común pitonica de configurar el estado de nivel de clase es con los parámetros de la función __init__. ¿Cuál es la función __init__ para un módulo? – bryhoyt

+1

Y, más al punto (porque es fácil poner código de tiempo de ejecución directamente en el módulo, como una función __init__), ¿cómo paso los parámetros a la función de módulos "__init__"? – bryhoyt

Cuestiones relacionadas