Como adicionar uma variável para o módulo I importar?
Pergunta
O que eu quero fazer é algo como isto:
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, eu tenho um modelo de módulo de outros módulos devem 'estender' contribuindo com as variáveis necessárias.Isso pode ser feito de uma forma funcional (como oposição a herança de objetos)?
EDITAR:Acrescentou um pouco mais de código.
Solução
Eu não tenho certeza do que você quer dizer com "uma forma funcional" -- você quer dizer, como no programação funcional?Que não vai acontecer (já que você está intrinsecamente tentando modificar um objeto, que é o inverso do FP).Ou você quer dizer algo como "uma forma que funciona"?
Para esta última interpretação, o grande problema é o import *
parte-entre os muitos problemas que sugere não usar isso, você está indo para ser executado diretamente em um:ele executa uma instantâneo de qualquer que seja o nível de módulo nomes estão vinculados ao tempo (ou apenas aqueles listados no __all__
no módulo, se definido) -- futuras alterações para as ligações de nomes nunca vai ser refletida em módulos que já fez a import *
.
Por que você acha que precisa mesclar a template_module
's de espaço de nomes em que o módulo de importação?Se você não regular import template_module as tm
, e , em seguida, simplesmente referindo-se a todos os nomes relevantes como tm.this
, tm.that
vai funcionar muito bem (inclusive pegando todas as alterações para as ligações até o instante em que usar -- em outras palavras, ele usa o "late binding" abordagem que parecem exigir aqui).
Outras dicas
Se você alterar uma propriedade de um módulo em um só lugar, será o mesmo em outros lugares também.Prova:
Crie um arquivo '/tmp/test1.py':
imoprt os
os.path = '' # set os.path (module) to a mere string
os.zzz = 'zzz'
Em seguida,
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'
Agora so.caminho é uma seqüência de caracteres vazia, mesmo na aplicação principal, e zzz está em todos os lugares também.
Acontece que este tem um tecido solução centralizada.
Então, você tem um resumo some__fab__template.py e uma de concreto fabfile.py que deve 'estender' o modelo de contribuir com algumas variáveis necessárias (e.g.nome do projeto).
Eu o tenha implementado utilizando fab env dicionário.
No arquivo de modelo de referência env.VAR
e o 'concreto' fabfile.py você fazer isso:
from fabric.api import *
env.VAR = 'some value'
import some__fab__template
def dist():
some__fab__template.dist()