1

我想做的是这样的:

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 *

即我有一个模板模块,其他模块应该“扩展”贡献所需的变量。这可以以功能方式完成(与对象继承相反)吗?

编辑:添加了更多代码。

4

3 回答 3

4

我不确定您所说的“功能性方式”是什么意思-您是指在功能性编程中吗?这不会发生(因为您本质上是在尝试修改一个对象,这与 FP 正好相反)。或者你的意思是“一种有效的方式”?

对于后一种解释,最大的问题是import *部分——在许多建议不使用它的问题中,你将遇到一个问题:它执行当时绑定的任何模块级名称的快照(或者只是模块中列出的那些__all__,如果已定义)——未来对名称绑定的更改将永远不会反映在以前执行import *.

为什么您认为需要将template_module' 名称空间合并到导入模块的名称空间中?如果你只是做了一个常规的import template_module as tm,那么简单地引用所有相关的名称tm.thistm.that就可以正常工作(包括在使用时提取对绑定的所有更改——换句话说,它使用“后期绑定”方法你在这里似乎需要)。

于 2009-12-14T18:47:53.860 回答
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 也无处不在。

于 2009-12-14T18:51:19.600 回答
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()
于 2009-12-15T04:23:00.380 回答