Archivo de configuración con un archivo .py

Me han dicho que hacer esto sería una práctica no muy buena :

configfile.py

SOUNDENABLED = 1 FILEPATH = 'D:\\TEMP\\hello.txt' 

main.py

 import configfile if configfile.SOUNDENABLED == 1: .... f = open(configfile.FILEPATH, 'a') ... 

Esto se confirma por el hecho de que muchas personas utilizan archivos INI para la configuración local con el módulo ConfigParser o iniparse u otros módulos similares.

Pregunta:

¿Por qué utilizar un archivo INI para la configuración local + un módulo Python del analizador INI sería mejor que solo importar un configfile.py que contenga los valores de configuración correctos como constantes?

La única preocupación aquí es que un .py puede tener un código de Python arbitrario, por lo que tiene un potencial para romper su progtwig de manera arbitraria.

Si puede confiar en que sus usuarios lo usarán de manera responsable, no hay nada de malo en esta configuración. De hecho, en una de mis ocupaciones anteriores, estábamos haciendo precisamente eso, sin ningún problema que yo sepa. Por el contrario, permitió a los usuarios eliminar la duplicación al generar automáticamente partes repetitivas e importar otros archivos de configuración.

Otra preocupación es que si tiene muchos archivos, es mejor que los de configuración estén separados de los de código normal, para que los usuarios sepan qué archivos deben poder editar (el enlace anterior también aborda esto).

La importación de un módulo ejecuta cualquier código que contenga. Nada restringe su configfile.py a contener solo definiciones. En la línea, esta es una receta para problemas de seguridad y errores oscuros. Además, está vinculado a la ruta de búsqueda del módulo de Python para encontrar el archivo de configuración. ¿Qué sucede si desea colocar el archivo de configuración en otro lugar o si hay un conflicto de nombres?

Esta es una práctica perfectamente aceptable. Algunos ejemplos de proyectos conocidos que utilizan este método son Django y gunicorn .

Podría ser mejor por algunas razones.

  1. La única extensión que podría tener el archivo de configuración es py .
  2. No puede distribuir su progtwig con configuraciones en un directorio separado a menos que ponga un __init__.py en este directorio
  3. Los usuarios desagradables de tu progtwig pueden poner cualquier script de python en config y hacer cosas malas.

Por ejemplo, el motor de autocompletado de YouCompleteMe almacena la configuración en el módulo de Python, .ycm_extra_conf.py . De manera predeterminada, cada vez que se importa la configuración, le pregunta si está seguro de que el archivo es seguro para ser ejecutado.

  1. ¿Cómo cambiarías la configuración sin reiniciar tu aplicación?

En general, permitir la ejecución de código que proviene de un lugar externo es una vulnerabilidad que podría tener consecuencias muy graves.

Sin embargo, si no le importan estos, por ejemplo, está desarrollando una aplicación web que se ejecuta solo en su servidor, esta es una práctica aceptable para poner la configuración en el módulo de Python. Django lo hace.