题
我想要做的是这样的:
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 *
即我有一个模板模块的其它模块应该“”延伸有助于所需的变量。 这可以以功能性方式来完成(相对于对象继承)?
编辑:添加更多的代码
解决方案
我不知道你所说的“功能性地”的意思 - 你的意思是,作为的函数编程?这是不会发生的(因为你本质上试图修改一个对象,这是FP相反)。还是你的意思大概是“一个可行的办法”?
对于后者的解释,最大的问题是import *
一部分 - 建议不要使用,你会被嫌运行到一个的诸多问题中:它执行快照的任何模块级名称被在时间约束(或只是那些在模块中在__all__
列出的,如果是这样的定义) - 人名的绑定未来变化将永远不会被反映在先前做了import *
模块
为什么你认为你需要的template_module
的命名空间合并到该进口模块?如果你只是做了一个普通import template_module as tm
,然后简单地指的是所有相关的名称作为tm.this
,tm.that
会工作得很好(包括拿起所有更改绑定为使用的那一瞬间 - 换句话说,它采用了“迟到结合你似乎需要在这里”方法)。
其他提示
如果你在一个地方改变模块的性能,这将是在其他地方一样了。证明:
创建文件 '/tmp/test1.py':
imoprt os
os.path = '' # set os.path (module) to a mere string
os.zzz = 'zzz'
然后
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'
现在os.path中是一个空字符串,即使在主应用程序,和ZZZ无处不太
原来这有一个织物为中心的解决方案。结果
所以,你有一个抽象的 some__fab__template.py 和具体的 fabfile.py 应该“扩展”模板有助于一些必需的变量(如项目名称)。点击
我实现它利用工厂的 ENV 字典。结果
在模板文件中您引用env.VAR
并在 '具体' 的 fabfile.py 你这样做:
from fabric.api import *
env.VAR = 'some value'
import some__fab__template
def dist():
some__fab__template.dist()
不隶属于 StackOverflow