Domanda

Quello che voglio fare è qualcosa di simile a questo:

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 *

Vale a dire ho un modulo di modello di altri moduli dovrebbero 'estendere' contribuendo le variabili richieste. questo può essere fatto in modo funzionale (al contrario di opporsi eredità)?

EDIT:. Aggiunto un po 'più di codice

È stato utile?

Soluzione

Non sono sicuro di cosa si intende per "maniera funzionale" - vuol dire, come in programmazione funzionale ? Questo non accadrà (in quanto si sta cercando di intrinsecamente modificare un oggetto, che è il contrario di FP). O vuoi dire qualcosa come "un modo che funziona"?

Per quest'ultima interpretazione, il grosso problema è la parte import * - tra i tanti problemi che non suggerirei di usare questo, si sta andando ad essere in esecuzione a sbattere contro uno: si esegue un snapshot di nomi qualunque sia a livello di modulo sono legati al tempo (o solo quelli elencati nella __all__ nel modulo, se questo è definito) -. future modifiche le associazioni di nomi non saranno mai riflessa in moduli che in precedenza ha fatto il import *

Perché credi è necessario unire lo spazio dei nomi template_module in quella del modulo di importazione? Se hai appena fatto un import template_module as tm regolare, poi semplicemente riferimento a tutti i nomi importanti come tm.this, tm.that funzionerà bene (tra cui raccogliere tutte le modifiche le associazioni fino all'istante di utilizzo - in altre parole, si utilizza il "ritardo approccio "che sembra richiedere qui) vincolante.

Altri suggerimenti

Se si modifica una proprietà di un modulo in un unico luogo, sarà lo stesso in altri posti. Dimostrazione:

Creare un file '/tmp/test1.py':

imoprt os
os.path = '' # set os.path (module) to a mere string
os.zzz = 'zzz'

Poi

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'

Ora os.path è una stringa vuota, anche nel ricorso principale, e zzz è ovunque troppo.

Si scopre che questa ha una soluzione in tessuto-centric.
In modo da avere un abstract some__fab__template.py e una concreta fabfile.py che dovrebbe 'estendere' il modello che contribuisce alcune variabili necessarie (ad esempio nome del progetto).
Ho implementato utilizzando lo fab di ENV dizionario.
Nel file di modello si fa riferimento env.VAR e nel 'concreta' fabfile.py si esegue questa operazione:

from fabric.api import *
env.VAR = 'some value'
import some__fab__template

def dist():
    some__fab__template.dist()
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top