Рекурсивные вызовы без использования имени функции - PullRequest
2 голосов
/ 08 ноября 2019

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

Есть ли какие-либо средства для ссылки на функцию в ее собственном теле с помощью чего-то вроде this илиself?

>>> def count_down(cur_count):
...     print(cur_count)
...     cur_count -= 1
...     if cur_count > 0:
...         count_down(cur_count)
...     else:
...         print('Ignition!')
...     
>>> count_down(3)
3
2
1
Ignition!
>>> zaehle_runter = count_down
>>> zaehle_runter(2)
2
1
Ignition!
>>> del count_down
>>> zaehle_runter(2)
2
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "<input>", line 5, in count_down
NameError: name 'count_down' is not defined

1 Ответ

3 голосов
/ 08 ноября 2019

Когда вы вызываете свою функцию рекурсивно, имя функции ищется в (глобальной) области.

Поскольку имя теперь удалено, его не удается найти.

Чтобы обойти это,Вы можете создать внутреннюю функцию, которая выполняет рекурсивную работу. Это делает вашу рекурсивную функцию не затронутой этим удалением, поскольку она больше не является рекурсивной, а просто вызывает внутреннюю рекурсивную функцию

def count_down(cur_count):
    def internal_count_down(cur_count):
       cur_count -= 1
       if cur_count > 0:
           internal_count_down(cur_count)
       else:
           print('Ignition!')
    internal_count_down(cur_count)
...