2012-02-06 23 views
9

Estoy tratando de importar sólo una variable dentro de una clase de otro módulo:Importar una variable de clase de otro módulo

import module.class.variable 
# ImportError: No module named class.variable 

from module.class import variable 
# ImportError: No module named class 

from module import class.variable 
# SyntaxError: invalid syntax (the . is highlighted) 

que puede hacer lo siguiente, pero yo prefiero que acaba de importar la una variable Necesito.

from module import class as tmp 
new_variable_name = tmp.variable 
del tmp 

¿Esto es posible?

Respuesta

10
variable = __import__('module').class.variable 
+0

¿Estoy en lo cierto al pensar que esto importará todo el módulo? Equivalente a 'import module' then' variable = module.class.variable'? –

+7

Excepto que no vinculará ningún nombre al módulo importado. está bien; 'from module import clazz'" importa todo el módulo "también, * exactamente de la misma manera *. Simplemente no hay forma de evitar esto; no se puede garantizar que la definición de clase tenga sentido sin el resto del módulo contexto, y de manera similar para los atributos de la clase. –

+0

@Alex Siempre se importará el * módulo * completo (pero depende de tu declaración * qué * estará disponible en el alcance de tus scripts). 'from x1 import x2' cargará' x1' y luego buscará dónde encontrar 'x2', ya sea en el ámbito de' x2' o como un subpaquete. –

5

No se puede hacer eso - la declaración de importación sólo puede traer elementos de módulos o submódulos - Los atributos de clase, aunque direccionable con la misma sintaxis con puntos que se utiliza para acceder sub-módulo, no puede ser importados individualmente

Lo que puede hacer es:

from mymodule import myclass 
myvar = myclass.myvar 
del myclass 

De cualquier manera, siempre que uno no utiliza la sintaxis from module import anything, se lee todo el módulo y procesada excepción es

from module.submodule import submodule 

, donde, si el submódulo en sí no requiere todo el módulo, solo se procesa el submódulo.

(Por lo tanto, incluso onmy solución anterior, se lee mymodule, y ejecutado - no se hace accesible en el espacio de nombres global donde se hace la declaración de importación, pero será visible, con todos sus componentes, en el diccionario sys.modules

+0

¡Su solución parece notablemente similar a mi solución! gracias por la explicación –

Cuestiones relacionadas