2009-12-14 122 views
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 * 

即我有一個模板模塊,其他模塊應「擴展」促進所需的變量。 這可以以功能的方式完成(而不是對象繼承)?

編輯:添加了更多的代碼。

+0

我不知道這樣做的正確的方法是,但已經使用的那種相同讓我簡單地將「VAR = value」附加到template_module.py – Kimvais 2009-12-14 18:38:57

+1

「smth」是什麼意思? – 2009-12-14 18:42:07

+0

@ S.Lott:「某事」。 – AKX 2009-12-14 18:54:12

回答

4

我不確定你的意思是「功能性的方式」 - 你的意思是,如functional programming?這不會發生(因爲你本質上試圖修改一個對象,這是FP的反面)。或者你的意思是像「一種有效的方式」?

對於後一種解釋,最大的問題是import *一部分 - 建議不要使用,你會被嫌運行到一個的諸多問題中:它執行任何模塊級的快照名稱在當時被綁定(或者只在模塊中的__all__中列出),未來對名稱綁定的更改將永遠不會反映在先前執行import *的模塊中。

爲什麼你認爲你需要將template_module的命名空間合併到導入模塊的命名空間?如果你只是做了一個普通的import template_module as tm,那麼只需簡單地引用所有相關的名字tm.this,tm.that就可以工作得很好(包括獲取綁定到所有使用時刻的所有更改 - 換句話說,它使用「遲到綁定「的方法,你似乎需要在這裏)。

+0

@Alex Martelli感謝您的詳細信息。我基本上需要一個構建腳本來「擴展」提供所有必要細節的模板。複製'目標'電話會有點混亂,但似乎是要走的路。 – yanchenko 2009-12-14 20:02:35

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爲無處不在。

+0

當使用X import Y時,這不適用於不可變對象,如數字,元組或字符串,但:os.path =「foo」;從os導入路徑; os.path中= 「欄」;路徑 - >'富' – AKX 2009-12-14 18:56:23

+0

是的,這種方式路徑成爲os.path的引用,如果你改變它,你改變**本地**「路徑」。這不是說os.path變得不可變。 – 2009-12-14 19:10:00

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()