Python的 - 可以函数调用本身没有明确使用的名字吗?

问题描述 投票:5回答:4

或更广泛的问题:如何使一个递归函数的蟒蛇,并更名时,仅需要在声明改变了吗?

python recursion refactoring inspection
4个回答
3
投票

我发现了一个简单的,工作液。

from functools import wraps

def recfun(f):
    @wraps(f)
    def _f(*a, **kwa): return f(_f, *a, **kwa)
    return _f

@recfun
# it's a decorator, so a separate class+method don't need to be defined
# for each function and the class does not need to be instantiated,
# as with Alex Hall's answer
def fact(self, n):
    if n > 0:
        return n * self(n-1)  # doesn't need to be self(self, n-1),
                              # as with lkraider's answer
    else:
        return 1

print(fact(10))  # works, as opposed to dursk's answer

0
投票

下面是一个(未经测试)的想法:

class Foo(object):

    def __call__(self, *args):
        # do stuff
        self(*other_args)

0
投票

可以将功能结合到本身,因此它接收到自身的引用作为第一个参数,就好像在一个绑定方法self

def bind(f):
    """Decorate function `f` to pass a reference to the function
    as the first argument"""
    return f.__get__(f, type(f))

@bind
def foo(self, x):
    "This is a bound function!"
    print(self, x)

来源:https://stackoverflow.com/a/5063783/324731


0
投票

我不知道为什么你会想这样做,但尽管如此,你可以使用一个decorator实现这一目标。

def recursive_function(func):
    def decorator(*args, **kwargs):
        return func(*args, my_func=func, **kwargs):
    return decorator

然后你的函数将如下所示:

@recursive_function
def my_recursive_function(my_func=None):
    ...
© www.soinside.com 2019 - 2024. All rights reserved.