我想做的是这样的事情:
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 *
即我有一个模板模块,其他模块应该'扩展'贡献所需的变量。 这可以以功能方式完成(与对象继承相反)吗?
编辑:添加了更多代码。
答案 0 :(得分:4)
我不确定你的“功能性方式”是什么意思 - 你的意思是,如functional programming?这不会发生(因为你本质上试图修改一个对象,这与FP相反)。或者你的意思是“一种有效的方式”?
对于后一种解释,最大的问题是import *
部分 - 在许多不建议使用它的问题中,你将要运行一个:它执行快照< / strong>当时绑定的任何模块级名称(或者只是模块中__all__
中列出的那些名称,如果已定义) - 名称绑定的未来更改将永远不会反映在以前的模块中做了import *
。
为什么您认为需要将template_module
的命名空间合并到导入模块的名称空间中?如果您只是定期import template_module as tm
,那么只需将所有相关名称称为tm.this
,tm.that
就可以正常使用(包括在绑定之前获取对绑定的所有更改)使用 - 换句话说,它使用你在这里看起来需要的“后期绑定”方法。
答案 1 :(得分:0)
如果在一个地方更改模块的属性,它在其他地方也会相同。证明:
创建一个'/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也无处不在。
答案 2 :(得分:0)
原来这有一个以结构为中心的解决方案
所以你有一个抽象的 some__fab__template.py 和一个具体的 fabfile.py ,它应该“扩展”模板,提供一些必要的变量(例如项目名称)。
我用fab的 env 字典实现了它
在模板文件中,您引用env.VAR
,在'具体' fabfile.py 中,您可以这样做:
from fabric.api import *
env.VAR = 'some value'
import some__fab__template
def dist():
some__fab__template.dist()