Или более широкий вопрос: как сделать рекурсивную функцию в python и, изменив ее имя, ее нужно изменить только в декларации?Python - может работать сам вызов без явного использования имени?
1
A
ответ
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)
Смежные вопросы
- 1. Использования sys.path.insert без явного абсолютного пути
- 2. Подъем событий в KRL без использования явного
- 3. Профилирование Linq.DataContext без явного использования GlimpseDbConnection
- 4. Схема - вызов функции без имени
- 5. Вызов переменной в Matlab без использования полного имени?
- 6. Запуск сценария Python без явного открытия X11
- 7. Угловые требуют родительского контроллера без явного указания имени
- 8. Perl требует явного имени пакета
- 9. Расширение HtmlHelper не может заставить intellisense работать без использования stat
- 10. Может ли проект JSF работать без использования сервлета?
- 11. Может ли язык быть «полным» без явного литья типов?
- 12. Вызов функции без объекта или имени класса
- 13. Python перезарядка не может работать
- 14. Шаблонная функция без явного использования типа, странное перегрузочное ранжирование
- 15. WPF Анимация свойства ребенка без использования имени
- 16. Как создать неизменяемые DTO без явного использования конструктора?
- 17. Может ли блок в Smalltalk работать сам по себе?
- 18. Почему не работает() {}() сам вызов?
- 19. Вызов метода без явного приемника в основной среде
- 20. Вызов универсального метода без явного указания типа-аргументы
- 21. Как поймать исключение без явного использования блока try и catch
- 22. Как создавать интерфейсы без использования суб-интерфейса или явного класса
- 23. Объявляем объект, который реализует интерфейс без явного использования определенного класса
- 24. может работать Javascript без html?
- 25. Вызов метода класса без использования объекта?
- 26. Может ли Microsoft.office.interop.word.dll работать без установки офиса?
- 27. Вызов AppleScript с Python без использования osascript или appscript?
- 28. Как Wordpress может работать без транзакций?
- 29. Вызов локальной переменной по имени без eval
- 30. Может ли jQuery fadeIn работать без AJAX?
Возможный дубликат [Может ли лямбда-функция называть себя рекурсивно в Python?] (Http://stackoverflow.com/questions/481692/can-a-lambda-function-call-itself-recursively-in- python) – metatoaster
Почему вам нужно изменить имя функции? Вы можете это сделать, но в то же время есть лучший метод, чем динамическое имя функции. – JGreenwell
Это интересная мысль, но я надеюсь, что на самом деле вы используете достойную среду IDE или другой инструмент для рефакторинга, а не странные трюки. –