2012-04-28 34 views
5

tengo un código que se parece a esto:Python importar

from pyparsing import Word, alphas, Optional, ... 
# Do stuff ... 
# And at the end, save a result to the outside world. 
parser = ... 

# Now use parser but don't use anything else from pyparsing again. 

me gusta tener la conveniencia de llamar from <package> import <etc>, pero sólo quiero que sea utilizado en un segmento muy pequeño de código. Me temo que estoy contribuyendo a la contaminación del espacio de nombres porque tengo varios pequeños fragmentos como este en el mismo archivo.

¿Cuál es la manera Pythonic de manejar esta situación? Todavía estoy jugando con eso, así que preferiría no escribir y reescribir pyparsing. tantas veces.

Respuesta

7

Una forma fácil es usar ámbito de la función de controlar la visibilidad de importación en un archivo:

def prepare_parser(): 
    from pyparsing import Word, alphas, Optional, ... 
    # do stuff, and get the final thing to return 
    return ... 

parser = prepare_parser() 
+3

La técnica funciona y es fácil de hacer, pero no es común y una serie de desarrolladores se estremecen con la práctica de utilizar una función para ocultar las importaciones desde el ámbito global. En resumen, no estoy seguro de que esta sea una práctica recomendada. Poner importaciones dentro de las funciones normalmente solo se realiza con la necesidad de retrasar la importación (realizar la importación cuando se llama a una función, no cuando se carga un módulo). Señalo esto porque el OP está pidiendo prácticas Pythonic: hay otras técnicas que hacen el trabajo sin localizar las importaciones. –

+2

@RaymondHettinger Mi impresión es que la mayoría de los desarrolladores simplemente no se molestan en ocultar las importaciones desde el ámbito global. (Sobre todo, ya sea tratar con los valores extra en el espacio de nombres, o importar módulos y usar la notación '. ', posiblemente con un alias 'como') – Amber

+2

Realmente depende de si espera que los usuarios ejecuten '' help (sumodulo) '' o '' dir (tumodulo) '' para descubrir la API. Ambas técnicas de descubrimiento de API se ven afectadas por el desorden del espacio de nombres. –

11

Las formas habituales para controlar la contaminación del espacio de nombres son

  1. Eliminar las variables después de su uso
  2. Uso la variable __all__
  3. Usar importación-como para subrayar nombres de variable

Todas estas técnicas son utilizadas por los desarrolladores principales en la biblioteca estándar. Por ejemplo, el módulo decimal :

En conjunto, estas técnicas mantienen el espacio de nombres tan limpio como un silbido.