Cómo agregar una variable al módulo de E importar archivos desde?
Pregunta
Lo que quiero hacer es algo como esto:
template.py
def dummy_func():
print(VAR)
# more functions like this to follow
fabfile.py
# this gets called by fabric (fabfile.org)
# safe to think of it as ant build.xml
import template
template.VAR = 'some_val'
from template import *
A saber Tengo un módulo de plantilla de otros módulos deben 'extender' contribuyendo las variables requeridas. ¿Es posible hacerlo de una manera funcional (en contraposición a objetar la herencia)?
EDIT:. Se ha añadido un poco más de código
Solución
No estoy seguro de lo que entendemos por "una manera funcional" - Qué quiere decir, como en programación funcional ? Eso no va a ocurrir (ya que está intrínsecamente tratando de modificar un objeto, que es lo contrario de FP). O Qué quiere decir algo así como "una manera que funcione"?
En esta última interpretación, el gran problema es la parte import *
- entre los muchos problemas que no sugerir el uso de eso, vas a estar corriendo justo en una sola: se realiza un instantánea de nombres que sea a nivel de módulo están consolidados en el tiempo (o sólo aquellas que figuran en __all__
en el módulo, si eso es definido) -. futuros cambios en los enlaces de los nombres no se reflejarán en los módulos que lo hicieron con anterioridad al import *
¿Por qué cree que necesita para combinar espacio de nombres del template_module
en la del módulo de importación? Si usted acaba de hacer un import template_module as tm
regular, entonces simplemente se refiere a todos los nombres relevantes como tm.this
, tm.that
funcionará bien (incluyendo recoger todos los cambios en las fijaciones hasta el instante de uso - en otras palabras, se utiliza la "tarde enfoque "que parecen requerir aquí) vinculante.
Otros consejos
Si cambia una propiedad de un módulo en un solo lugar, será lo mismo en otros lugares también. Prueba:
Crear un archivo '/tmp/test1.py':
imoprt os
os.path = '' # set os.path (module) to a mere string
os.zzz = 'zzz'
Entonces
cd /tmp && python
>>> dir(test)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'os', 'z']
>>> test.os
<module 'os' from '/usr/lib/python2.6/os.pyc'>
>>> test.os.path
''
>>> import os
>>> os.path
''
>>> os.zzz
'zzz'
Ahora os.path es una cadena vacía, incluso en la aplicación principal, y zzz está en todas partes también.
Resulta que esto tiene una solución centrada en la tela.
Por lo que tiene un resumen some__fab__template.py y un hormigón fabfile.py que debe 'extender' la plantilla que contribuye algunas variables requeridas (por ejemplo, nombre del proyecto).
He implementado que la utilización de Fab env diccionario.
En archivo de plantilla se hace referencia env.VAR
y en el 'concreto' fabfile.py usted hace esto:
from fabric.api import *
env.VAR = 'some value'
import some__fab__template
def dist():
some__fab__template.dist()