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

Python 如何将变量添加到我从中导入的模块?,python,fabric,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

我想做的是这样的:

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*
部分——在许多建议不使用该部分的问题中,您将遇到一个:它对当时绑定的任何模块级名称执行快照(或者只列出模块中的
\uuuuuu all\uuuuuu
中列出的那些,如果已定义的话)--对名称绑定的未来更改将永远不会反映在以前执行
导入*
的模块中


为什么您认为需要将
template\u模块
的命名空间合并到导入模块的命名空间中?如果您只是将一个常规的
import template\u模块作为tm
,那么只需将所有相关名称引用为
tm。这个
tm。这样就可以了(包括在使用前对绑定进行所有更改——换句话说,它使用了您在这里似乎需要的“后期绑定”方法)。

我不确定您所说的“功能性方式”是什么意思——您的意思是,如中所述?这不会发生(因为你本质上是在试图修改一个对象,这是FP的反面)。或者你的意思是“一种工作方式”

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


为什么您认为需要将
template\u模块
的命名空间合并到导入模块的命名空间中?如果您只是将一个常规的
import template\u模块作为tm
,那么只需将所有相关名称引用为
tm。这个
tm。这样就可以了(包括在使用前获取对绑定的所有更改——换句话说,它使用了您在此处似乎需要的“后期绑定”方法)。

如果您在一个位置更改模块的属性,在其他位置也将相同。证明:

创建一个文件“/tmp/test1.py”:

imoprt os
os.path = '' # set os.path (module) to a mere string
os.zzz = 'zzz'
然后

cd/tmp&&python
>>>主任(测试)
[“内置”、“文档”、“文件”、“名称”、“包”、“操作系统”、“z”]
>>>test.os
>>>test.os.path
''
>>>导入操作系统
>>>操作系统路径
''
>>>os.zzz
“zzz”

现在,即使在主应用程序中,os.path也是一个空字符串,zzz也无处不在。

如果在一个位置更改模块的属性,在其他位置也会相同。证明:

创建一个文件“/tmp/test1.py”:

imoprt os
os.path = '' # set os.path (module) to a mere string
os.zzz = 'zzz'
然后

cd/tmp&&python
>>>主任(测试)
[“内置”、“文档”、“文件”、“名称”、“包”、“操作系统”、“z”]
>>>test.os
>>>test.os.path
''
>>>导入操作系统
>>>操作系统路径
''
>>>os.zzz
“zzz”

现在,即使在主应用程序中,os.path也是一个空字符串,zzz也无处不在。

证明它有一个以结构为中心的解决方案。
因此,您有一个抽象的some_uuufab\uu template.py和一个具体的fabfile.py,它应该“扩展”提供一些必需变量(例如项目名称)的模板。
我已经使用fab的env字典实现了它。
在模板文件中引用
env.VAR
,在“concrete”fabfile.py中执行以下操作:

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

def dist():
    some__fab__template.dist()

事实证明,这是一个以结构为中心的解决方案。
因此,您有一个抽象的some_uuufab\uu template.py和一个具体的fabfile.py,它应该“扩展”提供一些必需变量(例如项目名称)的模板。
我已经使用fab的env字典实现了它。
在模板文件中引用
env.VAR
,在“concrete”fabfile.py中执行以下操作:

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

def dist():
    some__fab__template.dist()

我不知道这样做的正确方法是什么,但我一直在使用相同的方法,所以我只是附加“VAR=value”到模板_模块。py@AKX还有@gsmd:请问可以用英语写吗?'smth'不是英语AFAIK。@S.Lott smth在英国教科书中使用。我不知道这样做的正确方法是什么,但一直在使用相同的东西,所以我只是附加“VAR=value”到模板_模块。py@AKX和@gsmd:请问可以用英语写吗?'smth'不是英语AFAIK。@S.Lott smth用于英国文本书。当使用from X import Y时,这不适用于数字、元组或字符串等不可变对象,尽管:os.path=“foo”;from os import path;os.path=“bar”;path-->'foo'是的,这种方式路径将成为对os.path的引用,如果您更改它,您将更改本地“路径”。这并不是说os.path变为不可变的。当使用from X import Y时,这不适用于不可变的对象,例如数字、元组或字符串,尽管:os.path=“foo”;from os import path;os.path=“bar”;path-->'foo'是的,这种方式path将成为对os.path的引用,如果您更改它,则会更改本地“path”。这并不是说os.path变得不可变。@Alex Martelli感谢提供详细信息。我基本上需要一个生成脚本来“扩展”提供所有必要细节的模板。复制“目标”调用会有点混乱,但似乎是一种方法。@Alex Martelli感谢提供详细信息。I b