Desde-Importar manteniendo el acceso por módulo

El título es un poco difícil de entender, pero mi pregunta es simple.

Tengo un progtwig que necesita tomar el sqrt() de algo, pero eso es lo único que necesito de las math . Parece un poco inútil importar el módulo completo para capturar una sola función.

Podría decir from math import sqrt , pero luego sqrt() se agregaría al espacio de nombres principal de mi progtwig y no quiero que eso (especialmente porque planeo modificar el progtwig para poder utilizarlo como un módulo; la importación podría causar problemas ¿en esa situación?). ¿Hay alguna forma de importar solo esa función mientras se mantiene la syntax math.sqrt() ?

Estoy usando Python 2.7 en este caso específico, pero si hay una respuesta diferente para Python 3, me gustaría escuchar eso también para futuras referencias.

De cualquier manera, usted “importa” el módulo math completo en el sentido de que está comstackdo y almacenado en sys.modules . De modo que no tiene ningún beneficio de optimización si lo hace from math import sqrt comparación con import math . Ellos hacen exactamente lo mismo. sys.modules todo math módulo math , lo almacenan en sys.modules y luego la única diferencia es que el primero trae la función sqrt a su espacio de nombres y el segundo trae el módulo math a su espacio de nombres. Pero los nombres son solo referencias para que no se beneficie la memoria o la CPU con solo importar una cosa del módulo.

Si desea la syntax math.sqrt , simplemente use import math . Si desea la syntax sqrt() , utilice from math import sqrt .

Si su preocupación es proteger al usuario de su módulo de no contaminar su espacio de nombres si realiza una importación de estrella: from your_module import * luego defina una variable __all__ en su módulo, que es una lista de cadenas que representan objetos que se importarán si el usuario de su módulo hace un inicio de importación.

Use desde math import sqrt . Puede proteger las funciones que exporta del módulo mediante una instrucción __all__ . __all__ debe ser una lista de los nombres que desea exportar desde su módulo.

La respuesta corta es no. Solo hazlo from math import sqrt . No causará ningún problema si utiliza el script como un módulo y no hace que el código sea menos legible.

No, eso no es posible, debido a cómo funcionan los módulos. ¿Qué pasa con las import math ?

Considerar:

module.py

 x = 1 def foo(): return x x = 2 def bar(): returnx 

principal (pseudo-código):

 import main but_only foo print foo() 

Python no conoce la función foo hasta que llega a la línea def foo . Lo que estás proponiendo es que se ejecute una selección aleatoria de líneas del módulo. Pero, ¿cómo puede Python saber qué líneas? En este ejemplo, ¿qué valor devolvería foo() ?