2012-04-03 55 views

回答

6

You can't.

編輯:gc.get_referrers存在,但不會告訴你它引用的函數對象來稱呼它,所以它不會幫你。另外,使用該函數時有一些注意事項,我不知道它是否可以在CPython以外的實現中使用。它不鼓勵在生產代碼中使用它。

最後一點,而常見問題可能不是有關是否可以確定物體的名稱完全正確的,其見解是否你應該是死的。

+0

(請參閱鏈接以獲得非常好的解釋。) – Taymon 2012-04-03 20:01:37

+0

好的答案,除非它不是一個真正正確的答案。你真的可以。無論你*應該*是不同的事情;-) – 2012-04-03 20:08:11

+0

重新編輯的答案來反映這一點。我不知道'gc.get_referrers',但我認爲你仍然不能告訴_which_引用了一個函數來調用它。 – Taymon 2012-04-03 20:49:00

2

˚FDEF創建的,歸因於__name__同時被創建。該屬性被分配給該函數對象,並且無論您隨後將函數分配給哪個屬性,該屬性都會一直存在。

通常,一個對象不知道它指向哪個變量。

然而,我們確實有比使用實現特定的邏輯就像gc.get_referrers)工具(找一個對象的所有引用:

>>> def f(x): 
    return x**2 

>>> g = f 

>>> import gc 
>>> gc.get_referrers(f)[0].keys() 
['g', 'f', '__builtins__', '__package__', 'gc', '__name__', '__doc__'] 

另一種方法是掃描命名爲特定的所有實例對象:

>>> [key for key, value in globals().items() if value == f] 
['g', 'f'] 
+0

這個函數找到了所有的函數名稱,而不是像問題標題(或者我錯過了什麼?)中所述的那樣「在函數名稱的什麼名字下查找」。當然,可能對OP仍然有用。 – weronika 2012-04-03 20:28:45

1

您可以通過使用inspect檢查模塊的源代碼做,然後才用一些限制(最起碼,你需要能夠獲得行的地方提及的名稱)。

你絕對不應該這樣做,除非你真的知道你爲什麼需要它。

1
a = 1 
b = 1 
c = 1 

1的名字是什麼?這個問題甚至有意義嗎?

功能是像任何其他對象,諸如1"cats"。它有一個__name__屬性,它告訴你什麼名字它最初被定義爲,但其他的名字可以被分配給它,並沒有記錄保存這些分配的對象。

您可以搜索所有本地和全局變量,但不會找到所有可能的引用;對函數的引用可以在容器中保存,如字典或列表,作爲對象屬性,作爲其他模塊中的全局變量,以及其他我現在沒有想到的地方。哦!閉包。不過,這是要點:

def f(): 
    pass 

g = f 

allvars = dict(globals()) 
allvars.update(locals()) 
funcnames = [key for (key, value) in allvars.iteritems() if value is f] 
# returns ['g', 'f']