2013-04-22 33 views
2

在文件a.py,我有臺詞:是Python的猴子補丁當地模塊的本地?

 

import gevent 
gevent.monkey.patch_all() 

import b 
# etc, etc 
 

在文件b.py是有必要的猴子補丁一遍嗎?猴子補丁多次出錯了嗎?

+2

我不是'gevent'的專家,但是我看不到任何不會是「全局」的方式......例如,我看不到在'b'中調用的任何方式都不會像'a'中的猴子修補版本那樣行事。至於多次修補猴子的問題,這可能是安全的,但我想這取決於實施。 – mgilson 2013-04-22 05:29:08

回答

0

通常每個模塊只有一個條目sys.modules。即相同的模塊對象是共享的,所以只要它以相同的方式導入就會影響模塊。

如果導入方式不同,可能在sys.modules下的兩個或多個條目中具有相同的模塊。

+0

我不認爲我完全理解你。例如,'socket'是由gevent修補的猴子。因此,如果'a.py'具有'import socket'並且'b.py'具有'來自套接字導入*',那麼效果會不同? 'b.py'不會被猴子修補? – donatello 2013-04-22 06:29:57

+0

@donatello它取決於*修補完成時和導入完成時的*。如果在導入之前修補*,則所有導入都會受到影響,但是如果導入是在修補之前發生的,那麼'a.py' *可能*具有修補模塊,而'b'仍然會使用原始功能等。 (由於明星進口)。我不知道'gevent'是如何修補的,所以'a'可能會或可能不會使用修補版本,具體取決於'gevent'是替換模塊對象還是更改其屬性。 – Bakuriu 2013-04-22 07:42:44