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.

Foi útil?

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()
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top