2011-07-16 82 views
0

我有2個模塊A和B. 模塊A沒有內部和模塊B有一個函數'f' 我想分配函數'f'給模塊A,但我想覆蓋此功能全局變量,因爲我想讓這個函數使用A模塊變量。更改功能模塊

但是我遇到了一些問題。這個簡單的代碼:

print A 
print B 
print '---' 
from copy import deepcopy 
setattr(A, 'f', deepcopy(B.f)) 
A.f.__module__ = A 
A.f.__globals__['__name__'] = 'A' 
print A 
print B 

我已經得到了以下結果:

<module 'A' from '<path>/A/__init__.pyc'> 
<module 'B' from '<path>/B/__init__.pyc'> 
--- 
<module 'A' from '<path>/A/__init__.pyc'> 
<module 'A' from '<path>/B/__init__.pyc'> 

爲什麼當我只改變的功能之一全局關鍵模塊的名稱變化,哪能阻止它?

+0

爲什麼不把它放在首位呢? – delnan

+0

這是可怕的哈克。你想達到什麼目的? –

+0

我試圖實現一些非常簡單的事情 - 我有2個模塊A和B.A有變量x ='A',B有變量x ='B'。附加B模塊獲得函數'f',打印'self.x'。我希望能夠將該函數'注入'到模塊A中,但是在調用Af()之後,我想得到'A'(因爲這個函數會在A中)。 – Pytor

回答

1

您可以嘗試使用functools.update_wrapper

A.f = functools.update_wrapper(wrapper=B.f, wrapped=A.f) 

這將修改B.f,雖然(使其承擔的A.f__module____name____doc__,請參閱functools模塊的源代碼方面)。因爲你真的沒有說你想要完成什麼(而不是你如何努力完成它),我真的不能說這是否是你想要的。

+0

我會嘗試一下,謝謝。 你說得對 - 我沒有告訴我要做什麼,因爲我認爲這個話題真的很大。但我想要做的是編寫一些工具來重新加載python模塊及其依賴項。 事實上,我試圖寫這樣的想法: http://doublestar.org/in-place-python-reloading/ 解決方案很簡單 - 您可以刪除所有要從系統重新加載的模塊.modules(首先進行備份),重新加載它們,然後將所有新的和已更改的方法注入到您重新加載的這些備份模塊中。 – Pytor

+0

到目前爲止,最好的方法是重新加載所有模塊,並用它們的依賴關係對它們進行排序,但當模塊依賴於自己的方式時,它不起作用。 (模塊A導入B和B導入A - 如果B導入A不在其聲明的開始部分,則這種情況是可能的)。在我的情況下,RollbackImporter也不是很好的解決方案(我不會描述,因爲它真的很大)。 – Pytor

+0

我測試了這段代碼,你已經發布了,它似乎不工作:( 讓concider下面的代碼(A有沒有函數f): 從複製import deepcopy; import functools; setattr(A,'f' ,deepcopy(Bf)); Af = functools。update_wrapper(wrapper = B.f,wrapped = A.f) print A.f .__ globals __ ['__ name__'] 因此,我們得到'B',而不是'A':( – Pytor