2017-03-08 49 views
0

如何獲取注入方法的依賴項列表,但看不到?在Python中打印捕獲的對象的列表

指着一些閱讀也將是巨大的:)

例子:

external_object = "abc" 
def func(data, params) 
    print(external_object) 
    ... 

def get_list_of_dependencies(func): 
    # TODO 

依賴的get名單將打印出的外部對象。我嘗試這樣做的原因是因爲我試圖記憶函數func,但由於注入到函數中的這些外部依賴項,我創建的哈希函數不能完全工作。

謝謝!

+0

這可能是我自己缺乏理解,但是這是什麼意思來記憶一個函數?什麼是外部注入依賴?有外部圖書館嗎? – mitoRibo

+0

此外,你有一個*功能*不是一種方法。 –

+0

感謝您的澄清。仍然在我腦海中的上下文切換階段:P – Akshay

回答

2

我相信你想要的東西可以通過檢查連接到你的function對象的__code__對象來實現。例如:

在一個名爲funcs.py:現在

external_object = "external object" 
def f(): 
    print(external_object) 
    nested = "nested" 
    def g(): 
     print(nested) 
    return g 

,在解釋對話:

鍵入 「help」, 「版權」, 「信用」 或 「許可」 的詳細信息。

>>> import funcs 
>>> funcs.f.__code__.co_names 
('print', 'external_object') 
>>> 

或者,如果你想要的局部變量:

>>> funcs.f.__code__.co_cellvars 
('nested',) 

您也可以訪問其他的東西,比如自由變量。請注意,nested是在封閉的g自由變量:

>>> g = funcs.f() 
external object 
>>> g.__code__.co_names 
('print',) 
>>> g.__code__.co_freevars 
('nested',) 
>>> 

瞭解更多有關可用屬性here。我會注意到,它可能是不依賴於這個偉大的想法,因爲在文檔的警告,

它們的定義可能與解釋, 的未來版本中改變,但他們在這裏提到的完整性。

+0

哦,哇!非常感謝!這就是我一直在尋找的。根據我的理解,__code__顯示編譯對象的代碼。有沒有辦法在一個方法中運行這個? – Akshay

+0

@Akshay你是什麼意思「在一個方法中運行」? –

+0

示例: def magic_function(func): print func .__ code __。co_names 或者那是不好的練習 – Akshay

0

的功能(在__code__屬性中找到)的代碼對象包含多個屬性,讓在代碼對象本身,例如所使用的值和名稱co_consts,co_names