2011-12-27 12 views
6

estoy usando la función Python execfile() como una forma flexible, simple pero de manejo de archivos de configuración - básicamente, la idea es:Importación de un módulo python a un dict (para uso como globales en execfile())?

# Evaluate the 'filename' file into the dictionary 'foo'. 
foo = {} 
execfile(filename, foo) 

# Process all 'Bar' items in the dictionary. 
for item in foo: 
    if isinstance(item, Bar): 
    # process item 

Esto requiere que mi archivo de configuración tiene acceso a la definición de la Bar clase. En este simple ejemplo, eso es trivial; podemos simplemente definir foo = {'Bar' : Bar} en lugar de un dict vacío. Sin embargo, en el ejemplo real, tengo un módulo completo que quiero cargar. Uno de sintaxis obvio de esto es:

foo = {} 
eval('from BarModule import *', foo) 
execfile(filename, foo) 

Sin embargo, yo ya he importado BarModule en mi archivo de nivel superior, por lo que parece que debería ser capaz de simplemente definir directamente foo como el conjunto de cosas definido por BarModule , sin tener que pasar por esta cadena de eval y import.

¿Hay una manera idiomática simple de hacer eso?

+1

No archivo evalfile existe; ¿te refieres a execfile? –

+0

Usar eval no es la idea obvia de IMO, porque Python hace una distinción entre expresiones y declaraciones. eval puede evaluar una expresión (por ejemplo, 'eval ('2 + 2')'), exec es para enunciados (por ejemplo, 'exec' a = 2 + 2''). importar es una declaración. –

+0

@ ÉricAraujo: Me refiero a execfile, sí; ediciones hechas. –

Respuesta

7

Quizás pueda usar el __dict__ definido por el módulo.

>>> import os 
>>> str = 'getcwd()' 
>>> eval(str,os.__dict__) 
1

La solución típica es utilizar getattr:

>>> s = 'getcwd' 
>>> getattr(os, s)() 
6

Utilice la función incorporada vars() para obtener los atributos de un objeto (como un módulo) como un diccionario.

Cuestiones relacionadas