Las otras respuestas evidencian una leve confusión en cuanto a cómo import
realmente funciona.
Esta afirmación:
import foo
es más o menos equivalente a esta declaración:
foo = __import__('foo', globals(), locals(), [], -1)
Es decir, se crea una variable en el ámbito actual con el mismo nombre que el módulo solicitado, y cesionarios es el resultado de llamar al __import__()
con ese nombre de módulo y una carga de argumentos predeterminados.
La función __import__()
maneja conceptualmente convierte una cadena ('foo'
) en un objeto de módulo. Los módulos están en caché en sys.modules
, y ese es el primer lugar que se ve __import__()
- si sys.modules tiene una entrada para 'foo'
, eso es lo que __import__('foo')
devolverá, cualquiera que sea. Realmente no me importa el tipo.Puedes ver esto en acción tú mismo; intente ejecutar el siguiente código:
import sys
sys.modules['boop'] = (1, 2, 3)
import boop
print boop
Dejando a un lado las preocupaciones estilísticas, por el momento, con una sentencia de importación dentro de una función de cómo funciona te gustaría. Si el módulo nunca se importó anteriormente, se importa y almacena en caché en sys.modules. A continuación, asigna el módulo a la variable local con ese nombre. No no no modifica ningún estado de nivel de módulo. Es hace posiblemente modificar algún estado global (agregando una nueva entrada a sys.modules).
Dicho esto, casi nunca uso import
dentro de una función. Si la importación del módulo crea una desaceleración notable en su programa -como hace una computación larga en su inicialización estática, o es simplemente un módulo masivo- y su programa rara vez necesita el módulo para nada, está perfectamente bien tener la importación solo dentro las funciones en que se usa. (Si esto era desagradable, Guido saltaría en su máquina del tiempo y cambiaría Python para evitar que lo hagamos). Pero como regla, yo y la comunidad general de Python ponemos todas nuestras declaraciones de importación en la parte superior del módulo en el alcance del módulo.
que sería muy bueno tener una "con (importación StringIO) como ModuleName: sintaxis – JeremyKun
@Bean: Si eso es por lo que no tiene que escribir un nombre de módulo de largo o difícil de manejar, entonces no hay una manera fácil:' importa StringIO' y luego 'sio = StringIO'. Ahora puedes hacer' file_handle = sio.StringIO ('hello world') 'y guardar esos preciosos cinco caracteres. Sin embargo, usaría esto con moderación, porque puede hacer que el código sea más difícil para leer (la tarea es fácil de perder, los nombres de módulos no estándar pueden distraer) – cvoinescu