如何将变量添加到我导入的模块中?

时间:2009-12-14 18:34:56

标签: python fabric

我想做的是这样的事情:

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 *

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

编辑:添加了更多代码。

3 个答案:

答案 0 :(得分:4)

我不确定你的“功能性方式”是什么意思 - 你的意思是,如functional programming?这不会发生(因为你本质上试图修改一个对象,这与FP相反)。或者你的意思是“一种有效的方式”?

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

为什么您认为需要将template_module的命名空间合并到导入模块的名称空间中?如果您只是定期import template_module as tm,那么只需将所有相关名称称为tm.thistm.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()