2011-06-14 8 views
8

Estoy intentando importar un módulo desde dentro de una función y tenerlo disponible para todo mi archivo de la misma manera que si importara fuera de cualquier función y antes que el resto del código. La razón por la que está en una función es porque no tengo mucho control sobre la estructura del script. ¿Es esto posible sin recurrir a cosas como hackear __builtin__ o pasar lo que necesito a mi código?¿Es posible importar al alcance global desde dentro de una función (Python)?

+2

No hagas eso si te importa la próxima persona que tenga que leer tu código (probablemente tú mismo). Parece que está utilizando una mala práctica organizativa como excusa para una mala práctica de codificación; intenta arreglar la causa raíz. – msw

+1

Estoy modificando un proyecto de código abierto e intentando cambiar el mínimo absoluto necesario. – scott77777

+3

Entonces, al tratar de cambiar el mínimo necesario, lo hará incomprensible para todos los demás contribuyentes. Esa es una mala compensación. – msw

Respuesta

9

¿Qué tal algo así como globals()["os"] = __import__("os")?

supongo que esto podría ser envuelto en una función genérica si quería ya que el nombre del módulo es una cadena.

+0

Esto es bueno porque el índice se puede usar para emular el comportamiento de "importar como" que no está (creo) integrado en '__import __()'. Resulta que esto no resuelve mi problema, pero responde la pregunta que hice. – scott77777

7

Al ver sus nuevos comentarios, quiero hacer hincapié en que esto parece innecesario. En realidad está modificando el script más importando dentro de una función que importando en la parte superior del script de la manera normal. Aún así, en el espíritu de responder la pregunta, estoy dejando mi respuesta anterior.


Sinceramente no estoy seguro de que esta es la forma correcta de hacer esto, pero una rápida verificación confirma que si se declara el nombre del módulo como global dentro de la función antes de importar, que se importa en el espacio de nombres global.

>>> def import_re(): 
...  global re 
...  import re 
... 
>>> re 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 're' is not defined 
>>> import_re() 
>>> re 
<module 're' from '/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/re.pyc'> 

No hagas esto a menos que realmente tengas que hacerlo, y luego escríbelo en grandes letras rojas, por así decirlo.

Cuestiones relacionadas