2014-01-19 83 views
2

在JavaScript中,可以使用特殊變量/屬性arguments.callee在函數內部引用函數 。 例如,定義遞歸匿名函數 (但不僅限於此)可能很有用。據我所知,Python在Python中並不那麼容易。Python:引用自身內部的函數(如JavaScript中的arguments.callee)

但我想有可能使用inspect模塊, 或一些神祕的技術。

請問我可以怎麼做?

我潔具的問題

那不是我要找的,雖然名字聽起來不錯。

+0

有沒有這樣的參考,這就是爲什麼你提到的兩個職位在創建函數對象後,使用hack設置對函數本身的引用。 –

+0

其他參考:[從框架獲取可調用對象](http://stackoverflow.com/q/1132543)和[Python:某些「\ _ \ _ magic \ _ \ _」屬性引用該函數內的函數] (http://stackoverflow.com/q/14986523) –

+0

還有更多:[獲取代碼對象的Python函數](http://stackoverflow.com/q/12787108) –

回答

2

我假設你知道JavaScript的arguments.calleehas been deprecated。無論如何,下面有幾種方法可以在Python中做類似的事情,以至於你可能還沒有看到。

使用情況管理器:

class wrapped(object): 
    def __init__(self, func): 
     self.func = func 
    def __enter__(self): 
     def wrapper(*args, **kwargs): 
      return self.func(self.func, *args, **kwargs) 
     return wrapper 
    def __exit__(self, *args): 
     pass 

def test(callee, value=None): 
    if value is None: 
     print 'function attribute "x" is {}'.format(callee.x) 
    else: 
     print 'setting function attribute "x" to {}'.format(value) 
     callee.x = value 

with wrapped(test) as test: 
    test(42) # -> setting function attribute "x" to 42 
    test() # -> function attribute "x" is 42 

另一種更容易使用的方式是用一個函數裝飾:

from functools import wraps 

def deco(f): 
    @wraps(f) 
    def wrapper(*args, **kwargs): 
     return f(f, *args, **kwargs) 
    return wrapper 

@deco 
def test(callee, value=None): 
    if value is None: 
     print 'function attribute "x" is {}'.format(callee.x) 
    else: 
     print 'setting function attribute "x" to {}'.format(value) 
     callee.x = value 

test(42) # -> setting function attribute "x" to 42 
test() # -> function attribute "x" is 42 
相關問題