2014-07-08 50 views
1

我有個模塊即碎內部的功能猴修補根據另一功能模塊內的模塊功能

broken.py

def brokenfunc(): 
    dependency() 


def dependency(): 
    print "hello" 

例程依賴於另一個功能依賴性,這是細。我需要修補猴子打破,所以在另一個模塊中我做了

patched.py

import broken 

def brokenfunc(): 
    print "patched" 

    dependency() 

brokenfunc.__globals__["dependency"]=broken.brokenfunc.__globals__["dependency"] 
broken.brokenfunc = brokenfunc 

broken.brokenfunc() 

很顯然,我必須覆蓋全局,因爲在打補丁函數依賴修補模塊中的定義,並會在那裏尋找依賴。

這個工程,但我不滿意的黑客。我試圖更新整個全局字典,但在這種情況下,我重寫了太多,並且破壞的函數繼續運行。這是否是正確的方式(考慮角落案例)還是有另一種正確的策略?

回答

1

您可以直接引用的依賴在你的新功能:

import broken 

def brokenfunc(): 
    print "patched" 

    broken.dependency() 

broken.brokenfunc = brokenfunc 

,或者您可以通過進口補充dependency到你的模塊全局:

import broken 
from broken import dependency 

def brokenfunc(): 
    print "patched" 

    dependency() 

broken.brokenfunc = brokenfunc 

實在是沒有必要去這樣長度; brokenfunc.__globals__只是您當前的模塊命名空間

+0

是的。今天,我贏得了「如何讓我的生活更加複雜」獎 –

+0

,除了'__globals__'的重寫原因是嘲笑。有沒有我應該知道的角落案例? (免責聲明:我試過'mock'和'minimock',但是他們沒有按照我的意願工作,所以我用手工來代替)。 [數據模型](https://docs.python.org/2/reference/datamodel.html)具有*屬性*(引用本身)是隻讀的。 – n611x007

+0

爲什麼堅持要訪問'__globals__'?有更多可讀的方法來訪問模塊名稱空間,即使是動態的。相反,用'mock'努力嘗試。 –