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

¿Fue útil?

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()
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top