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

2024-06-17 10:56:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我想做的是这样:

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 *

也就是说,我有一个模板模块,其他模块应该“扩展”贡献所需的变量。 这可以用函数方式完成吗(与对象继承相反)?在

编辑:增加了一点代码。在


Tags: 模块topyimportvardefmoretemplate
3条回答

我不知道你所说的“功能性方式”是什么意思,像functional programming?这是不会发生的(因为你本质上是在试图修改一个对象,这是FP的反面)。或者你是说“一种有效的方式”?在

对于后一种解释,最大的问题是import *在建议不要使用它的许多问题中,import *将运行一个smack:它执行一个快照,不管模块级别的名称何时被绑定(或者只是那些在模块中__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'

那么

^{pr2}$

现在操作系统路径即使在主应用程序中也是空字符串,zzz也无处不在。在

原来这是一个以结构为中心的解决方案。
所以你有一个抽象的__模板.py和混凝土工厂文件.py这应该“扩展”提供一些必需变量(例如项目名称)的模板。
我已经使用fab的env字典实现了它。
在模板文件中引用env.VAR和“concrete”工厂文件.py这样做:

from fabric.api import *
env.VAR = 'some value'
import some__fab__template

def dist():
    some__fab__template.dist()

相关问题 更多 >