2013-07-22 238 views
1

我有一個功能叫做get_account(參數1,參數2)在運行時 我需要更換與功能mock_get_account此功能(參數1,參數2) 所以當系統調用get_account(參數1替換功能,param2)我需要調用mock_get_account(param1,param2)。與蟒蛇不同的功能

我試過這段代碼: package.get_account = self.mock_get_account package.get_account(X,Y) 但仍是get_account運行,而不是mock_get_account 我是新來的蟒蛇,我不知道這甚至可能,但我已經看到了lamda函數,並且我知道函數編程在python中是可能的。感謝 編輯: 如果我做到以下幾點:

package.get_account=self.mock_get_account 
package.get_account(x,y) 

然後每一件事情是確定的,這意味着mock_get_account被調用,但畝代碼我下面的代碼我做了後self.client.post(URL,數據=數據,請= TRUE)觸發package.get_account,這是行不通的:

package.get_account=self.mock_get_account 
package.get_account(x,y) 
#the folowing call will trigger the package.get_account(x,y) function in a django url  #callback 
self.client.post(url, data=data, follow=True) 

這意味着它調用側的文件中定義的舊功能,也get_account(參數1,參數2),並且是不是類的子函數,mock_get_account(self,param1,param2)在類Test中定義,並在Test.test_account內部調用 - 功能

+1

你所描述的應該可以正常工作。請給我們實際的代碼和結果。 –

+0

你能發佈一些實際的代碼嗎?像這樣的修補程序在許多分佈式軟件包中使用,所以如果正確完成,它會工作。 –

+0

如果我co以下:package.get_account = self.mock_get_account package.get_account(x,y),然後運行package.get_account每一件事情都可以,在下面的代碼中我做了一個職位self.client.post(url,data = data,follow = True)觸發package.get_account並且這不起作用,這意味着它打印舊函數,並且get_account(param1,param2)在文件的side中定義,並且不是類的子函數, mock_get_account(self,param1,param2)在Test類中定義,並在Test.test_account函數內部調用 – user1796624

回答

0

這是非常斟酌,並沒有(直接)回答你的問題,但希望能解決你的問題。

一個更好的做法是使用一個子類與mock_get_account的實現覆蓋父get_account方法,下面的例子:

class A(object): 

    def get_account(self): 
     return 1 

    def post(self): 
     return self.get_account() 

class B(A): 

    def get_account(self): 
     return 2 # your original mock_get_account implementation 

a = A() 
print(a.get_account()) 

b = B() 
print(b.post()) # this .post will trigger the overridden implementation of get_account 
0

我的猜測是,實施self.client.post代碼有通過import語句訪問get_account看起來像from package import get_account

from package import get_account如果尚未導入,則將首先加載package。然後它將在該模塊中查找名稱get_account,並且綁定到的任何對象都將被綁定到導入包的名稱空間中,同樣也以get_account的名稱進行綁定。此後這兩個名稱是指同一個對象,但它們不是同一個名稱。

所以,如果這一點後,你的嘲諷代碼走來,它集名稱get_accountpackage,而不是指mock_get_account。但是,這隻會影響從package再次讀取get_account的代碼;任何已經已經專門導入的名稱不會受到影響。

如果後面self.client.post的代碼,而不是以前只package訪問通過import package,並呼籲package.get_account它會工作,因爲它是那麼只表示已經在導入模塊的名稱空間被綁定的package模塊的對象。 package.get_account將讀取該對象的屬性,因此會得到任何當前值。如果from package import get_account出現在函數本地範圍而不是模塊範圍內,那麼它的行爲將類似。

如果我是正確的,你的代碼是這種方式構造,那麼它是不幸的是沒有真正package.get_account你需要重新綁定到一個模擬,但get_account名稱,其中self.client.post來自模塊(以及任何其他模塊,這些模塊可以稱之爲)。