从内部引用函数(如JavaScript中的arguments.callee)?

时间:2014-01-19 15:05:14

标签: javascript python function recursion

在JavaScript中,可以获得对该函数的引用 在其中,使用特殊变量/属性arguments.callee。 例如,定义递归匿名函数可能很有用 (但不仅仅是为了那个)。

据我所知,在Python中也不是那么容易。

但我想可以使用inspect模块, 或者一些神秘的技术。

你能告诉我怎么做吗?

我有问题

这不是我想要的,虽然名字听起来不错。

1 个答案:

答案 0 :(得分:2)

我假设你知道JavaScript是arguments.callee has 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