В python3, если функция с рекурсивным вызовом вводится в exec()
в функции, я получаю ошибку. Например, приведенный ниже код
def B(pys):
exec(pys)
pys="""
def fibonacci(n):
if n == 1 or n == 2:
r = 1
else:
r = fibonacci(n - 1) + fibonacci(n - 2)
return r
print(fibonacci(3))
"""
B(pys)
вызовет ошибку NameError.
$ py -3.8 testrecursivefun.py
Traceback (most recent call last):
File "testrecursivefun.py", line 14, in <module>
B(pys)
File "testrecursivefun.py", line 2, in B
exec(pys)
File "<string>", line 9, in <module>
File "<string>", line 6, in fibonacci
NameError: name 'fibonacci' is not defined
Если я запустил exe c (pys) непосредственно под модулем, исключение исчезнет.
Причина описана в другом вопросе Как exe c работает с локальными? . Но я до сих пор не знаю, как мне понять рекурсивный вызов в exec()
. Потому что имя функции для меня - Dynami c. Я не могу добавить его к locals()
к exec()
. Кто может помочь разобраться.