2011-04-26 57 views
3

This answer顯示函數的內置__name__屬性可以從以外的函數中使用,即print f.__name__。但是,如何從獲得這個屬性的這個屬性呢?如何從函數內部獲取函數的名字(或者是對函數的「自我」引用)?

僅僅使用不合格__name__沒有幫助:print __name__打印__main__

使用print f.__name__f()看起來很愚蠢 - 我也可以輸入"f"

另外,是否有一種self對象的函數,即我可以得到一個指針,以通用的方式執行的函數?

我不喜歡在this question中提出的方法 - 它認爲爲這麼簡單的任務攻擊棧不是正確的方法。

動機:我有一個{keyword:function}字典,從輸入中讀取關鍵字並執行相應的功能。我希望每個函數只執行一次,所以我希望每個函數在執行時都以某種數據結構註冊自己。我知道我可以在字典中做到這一點,但我想爲此使用單獨的數據結構。

Python版本是2.6.4 BTW

+1

只是鏈接到這個答案,它解決了標題中的問題:http://stackoverflow.com/a/5067654/547578 – fossilet 2013-03-23 13:17:37

+0

感謝@fossilet,但正如我在爲這個感覺玩調用堆棧的問題所說。 ..不知道,太hacky – davka 2013-03-24 13:59:28

+1

我覺得很幽默,你發現檢查是「太hacky」。授予導航多維堆棧的語法可能需要閱讀文檔,但它是有效的。這是另一個可能很有趣的黑客:將函數作爲參數傳遞給它自己。 – afeique 2017-10-10 18:24:59

回答

3

也許你應該裝點你與一個onlyonce裝飾調用每個函數?那會更加pythonic。概念證明如下。

called = set() 

def onlyonce(fn): 
    def decorated(*largs, **kargs): 
     if fn not in called: 
      called.add(fn) 
      print "Calling" 
      fn(*largs, **kargs) 
     else: 
      print "Already called" 
    return decorated 



@onlyonce 
def test_function(): 
    print "I am getting called now" 


test_function() 
test_function() 
test_function() 
test_function() 

此外,函數是「不可變的」,可以存儲爲字典鍵。你不必依賴名字。這可能是一個優點(或缺點),具體取決於您的使用。

+0

謝謝易卜拉欣。你的意思是你的最後一段我可以做'調用[f] =真'嗎? – davka 2011-04-26 08:47:54

+0

我的愚蠢,你在你的答案... – davka 2011-04-26 08:48:57

+0

是的,但我使用集而不是字典,因爲你沒有任何「價值」來存儲與密鑰。 – 2011-04-26 09:12:51

4

,如果你不想「考察」的堆棧,你可以使用一個裝飾你的方法將其存儲在您的dictionnary,避免啓動它的兩倍。

function_list = [] 
def method_singleton(function): 
    global function_list 
    def decorated_method(*args, **kwargs): 
     if function.__name__ not in function_list: 
      function_list.append(function.__name__) 
      return function(*args, **kwargs) 
     else: 
      print "Method %s already called"%function.__name__ 
    return decorated_method 

@method_singleton 
def method_to_decorate(arg1, arg2): 
    pass 

其中「function_list」是已經調用的函數列表(我不知道你如何管理你的dictionnary)

+0

現在我知道關於裝飾器感謝您的答案:),不是你的解決方案檢查'function_list'只有一次,當函數被定義和裝飾?每次執行該功能時,該支票都不應該是動態的嗎? – davka 2011-04-26 13:47:54

+0

哦,是的,你是對的;)在通話時,你必須將測試轉移到裝飾方法 – 2011-04-26 13:51:54

相關問題