2013-02-20 77 views
2

Python中是否有類似於Python的__FUNCTION__魔術常量?Python:一些「__magic__」屬性來引用該函數內的函數

def func(x): 
    print(__FUNCTION__) ## <function func at 0x00B02810> 
    print(__FUNCTION__.__name__) ## func 

UPD:

爲了有一個例子:

import sys 

def func(f = "Foo"): 
    b = "Bar" 
    print(sys._getframe().f_code) ## <code object func at 0x00B09A20, file "C:\py\func.py", line 5> 
    print(func.__code__) ## <code object func at 0x00B09A20, file "C:\py\func.py", line 5>, the same 

    print(sys._getframe().f_trace) ## None 
    print(sys._getframe().f_locals) ## {'b': 'Bar', 'f': 'Foo'} 
    print(sys._getframe().f_lineno) ## 12 

if __name__ == "__main__": 
    func() 
+0

出於興趣,你爲什麼要這樣做? – 2013-02-20 18:32:43

+0

@Lattyware,在PHP中我經常使用'__FUNCTION__','__METHOD__','__CLASS__'來創建像標誌一樣的優勢,以查看哪些組件運行發生。就像現在我學習Python並且一直在測試函數裝飾器一樣,我想用相同的技術來查看被調用的函數。 – Green 2013-02-20 18:53:19

回答

2

沒有在Python任何這樣的功能。

可能濫用sys._getframe() function以訪問當前代碼對象,但:

import sys 

def foo(): 
    print sys._getframe(0).f_code.co_name 

,但因爲它最初定義將只打印功能的名稱。如果您分配foo功能到另一個標識,上面的代碼將繼續打印foo

>>> bar = foo 
>>> bar() 
'foo' 
+0

+1是否有相當於獲取實例名稱的東西? – eyquem 2013-02-20 19:01:31

+0

@eyquem:這很難;你可以對當前框架的代碼對象進行反思,以得到碰巧是一個自定義類實例的函數的第一個參數(如果它被稱爲'self',那麼更好)。然而這不是失敗的。 – 2013-02-20 19:35:19

+0

謝謝。我將在某天探索這些可能性 – eyquem 2013-02-20 19:57:25

2

這是你所追求的?

In [97]: def a(): 
    ...:  print sys._getframe().f_code.co_name 
    ...:  

In [98]: a() 
a 

Source

+0

+1是否有相當於獲取實例名稱的東西? – eyquem 2013-02-20 19:00:54

3

你可以得到一些使用inspect module此功能。

import inspect 

def foo(): 
    code = inspect.currentframe().f_code 
    print code.co_name 

你也可以使用exec code其中code代碼對象執行的代碼是在上面的函數創建的變量。

請注意,inspect.currentframe()爲您提供了與sys._getframe(0)相同的對象,但它實際上是用於這種方式。

+0

*但它實際上是用這種方式*。不,「檢查」模塊提供了相同任務的友好拼寫;同樣的注意事項適用。 – 2013-02-20 18:01:50

+0

+1是否有相當於獲取實例名稱的東西? – eyquem 2013-02-20 19:00:27

相關問題