2010-05-26 7 views
16

¿Cuál es el mejor enfoque para ejecutar lo siguiente utilizando __import__ para que pueda especificar dinámicamente el módulo?Cómo importar * con __import__

from module import * 
+3

Pero son conscientes de que se debe evitar el uso de '' import *? –

+8

No está aquí para una conferencia semántica :) –

+0

¿Lo quiere en la población local? No deberías intentar hacer esto, pero la respuesta de Michael Mrozek está completamente equivocada de todos modos. La respuesta de Ignacio debe ser aceptada. –

Respuesta

5

Es lo mismo que una llamada normal de-importación, que acaba de pasar una lista que contiene '*' para la fromlist:

moduleName = "foo" 
__import__(moduleName, globals(), locals(), ['*']) 
+0

Eso en realidad no configura locales(), que es el problema que tengo :) –

+0

De acuerdo con el documento, el estándar '__import__' ni siquiera usa el argumento' locals'. Si anula '__builtin_______import__', puede ver exactamente lo que sucede cuando ejecuta' from foo import * ', parece que hace exactamente eso –

+0

No importa realmente los atributos, que es el problema. Los carga en la memoria pero no los establece en los módulos locales locales(). –

4

__import__() no añade nada al ámbito local. Tendrá que ir a través del módulo devuelto, accediendo a sus atributos como lo desee.

14

La única manera que encontró:

module = __import__(module, globals(), locals(), ['*']) 
for k in dir(module): 
    locals()[k] = getattr(module, k) 
+0

¿Por qué querrías hacer esto? Huelo mal código. || Por otro lado, puedes aceptar tus propias respuestas. –

+5

Porque es la única forma de resolver el problema abordado. –

+0

Esta parece ser la mejor opción para hacer las cosas rápidamente. La otra opción que he encontrado es hacer: "cmd = 'de% s import *'% moduleName; exec (cmd)". Todos gritarán, pero para los pequeños guiones parece ser la mejor manera. – mathtick

Cuestiones relacionadas