我想要做的是这样的:

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.thistm.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()
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top