2011-08-26 33 views
1

我有一個模塊'b'從模塊「a」導入方法,其中方法「a.method」使用「a」中定義的變量必須在「b」中重寫。簡單地說,代碼:強制導入的方法使用本地變量

module a.py: 

local_var = 1 
def method(): 
    print local_var 

module b.py: 

from a import method 
local_var = 2 
print method() 

運行蟒蛇b.py打印1,而不是2。在我的情況下進口的方法是一個Django 方法,所以我不能修改的模塊,我也想複製的方法到我的模塊並修改它。

我怎樣才能覆蓋另一個模塊的局部變量和導入的方法mkae使用新變量?

+0

感謝您的答覆。我試圖將jinja2模板支持添加到django中,沒有太多麻煩,儘管最終複製了一些django代碼來覆蓋局部變量。最後的工作是在github.com/altunyurt/djtemps – hinoglu

回答

1

嘗試內置exec功能:

在所有情況下,如果省略任選的部件,該代碼在當前範圍執行。如果僅指定in之後的第一個表達式,則它應該是一個字典,它將用於全局變量和局部變量。如果給出兩個表達式,它們分別用於全局變量和局部變量。如果提供,本地人可以是任何映射對象。

但我認爲你最好不要使用這樣的黑客。傳遞變量作爲函數參數,或使用類。

一個工作代碼:

a.py:

local_var = 1 
def method(): 
    print local_var 

b.py:

from a import method 
import inspect 

code = inspect.getsource(method) 
local_var = 2 
method() 
print code 
exec code 
method() 

python b.py

[email protected]:~/Desktop$ python b.py 
1 
def method(): 
    print local_var 

2 
[email protected]:~/Desktop$ 
+0

謝謝你,儘管我已經使用過「exec expr in globals()」幾次了,但是真的不知道它到底是什麼:) – hinoglu

1

你不行。這是設計。每個模塊都有自己的名稱空間。

但是,您可以保存var的當前值,分配新值,調用方法並恢復原始值。

# module a.py: 

local_var = 1 
def method(): 
    print local_var 

# module b.py: 

import a 
old_local_var = a.local_var 
a.local_var = 2 
print method() 
a.local_var = old_local_var 

由於jyore在評論中指出 - 這種方法應小心使用。這或多或少是一種黑客行爲。我能想到的唯一有效用途是測試或最後的度量衡量,其他所有事情(包括Chuck Norris)都失敗了。

+3

你是正確的,但OP需要小心這種方法,特別是如果他在具有多個連接的服務器上使用它(他提到了django)。如果多個線程正在寫入同一個現在全球化的變量,那麼數據寫入可能會產生不可預知的結果。我強烈建議不要在這種情況下使用這種模式。 – jyore

相關問題