2015-10-19 2 views
1

Или более широкий вопрос: как сделать рекурсивную функцию в python и, изменив ее имя, ее нужно изменить только в декларации?Python - может работать сам вызов без явного использования имени?

+0

Возможный дубликат [Может ли лямбда-функция называть себя рекурсивно в Python?] (Http://stackoverflow.com/questions/481692/can-a-lambda-function-call-itself-recursively-in- python) – metatoaster

+0

Почему вам нужно изменить имя функции? Вы можете это сделать, но в то же время есть лучший метод, чем динамическое имя функции. – JGreenwell

+0

Это интересная мысль, но я надеюсь, что на самом деле вы используете достойную среду IDE или другой инструмент для рефакторинга, а не странные трюки. –

ответ

0

Я нашел простой, работа .

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

Я не знаю, почему вы хотите сделать это, но, тем не менее, вы можете использовать декоратор для достижения этой цели.

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

И тогда вы действуете бы выглядеть следующим образом:

@recrusve_function 
def my_recursive_function(my_func=None): 
    ... 
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

Смежные вопросы