2012-04-26 40 views
6

Acabo de ejecutar el comportamiento donde la nariz no ejecutará pruebas marcadas como ejecutables (como se describe en a previous question). Encontré esto sorprendente, y perdí algo de tiempo tratando de descubrir por qué la nariz no estaba haciendo las pruebas antes de conocer el comportamiento de la nariz aquí.¿Qué significa "importar seguro" en Python?

En la página del manual de nosetests, se describe una opción para anular el comportamiento por defecto:

--exe    Look for tests in python modules that are executable. 
        Normal behavior is to exclude executable modules, 
        since they may not be import-safe [NOSE_INCLUDE_EXE] 

Mi pregunta es: ¿qué significa "importación-seguro"? ¿Qué es un ejemplo de un módulo no seguro para la importación? ¿Y un módulo no seguro para la importación puede ser seguro para la importación eliminando el bit ejecutable, o hay algo más que eso?

Respuesta

5

No estoy familiarizado con la nariz, pero estoy bastante seguro de lo que significa "importar seguro" es que importar el módulo solo definirá cosas, no se apagará y ejecutará cosas.

La idea sería que si un archivo .py está diseñado para ejecutarse como un script, entonces su funcionalidad se iniciará al ejecutar el código de módulo-alcance. Esto podría protegerse contra la importación con el truco __name__ == '__main__', pero podría no serlo. Si no es así, importarlo probablemente hará lo mismo que haría una secuencia de comandos cuando se invoca sin argumentos, lo que en algunos casos podría ser malo.

Por lo tanto, puede decirle explícitamente a la nariz que no existen dichos scripts ejecutables que podrían ser peligrosos al pasar el --exe, o puede borrar el permiso ejecutable de sus scripts.

4

Se refiere a los módulos que se pueden importar o ejecutar como un script. Esto se hace generalmente por el siguiente fragmento de código:

if __name__ == "__main__": 
    print "running as script" 

Si un guión que estaba destinado a ser ejecutable no tiene esta comprobación, la importación se ejecutará inmediatamente lo que probablemente va a terminar con efectos secundarios no deseados o excepción planteadas.

5

"import-safe" no tiene un significado específico definido. En este caso, el punto es que los módulos de Python pueden hacer algo cuando se importan (recuerde, importar un módulo solo significa ejecutarlo y guardar todo en su espacio de nombres).

Si el módulo está marcado con el bit ejecutable, nose asume que este es el caso, y dado que probablemente no quiera que eso suceda cada vez que ejecute las pruebas, omitirá el módulo.

+0

@NiklasB. Lo siento, no entiendo tu pregunta. ¿Qué es "eso"? – katrielalex

+0

No importa. Me refería a 'nose', pero de acuerdo con el mensaje de error, simplemente comprueba el bit de ejecución. –