Python не может найти выполненную функцию после exec () - PullRequest
0 голосов
/ 22 июня 2019

Я не могу найти выполненную функцию даже после исключения.

Это функция:

# function illustrating how exec() functions.
def exec_code():
    LOC = """ 
def factorial(num): 
    fact=1 
    for i in range(1,num+1): 
        fact = fact*i 
    return fact 
print(factorial(5)) 
"""
    exec(LOC) 
    print(factorial)

# Driver Code 
exec_code() 

Однако это приводит к ошибке:

NameError                                 Traceback (most recent call last)
<ipython-input-10-d403750cbbfb> in <module>
     13 
     14 # Driver Code
---> 15 exec_code()

<ipython-input-10-d403750cbbfb> in exec_code()
     10 """
     11     exec(LOC)
---> 12     print(factorial)
     13 
     14 # Driver Code

NameError: name 'factorial' is not defined

Я действительно хотел бы выполнить строковую функцию как шаблон выше.Кто-нибудь знает как это решить?Если exec не рекомендуется, есть ли другие решения?

Ответы [ 2 ]

1 голос
/ 22 июня 2019

Вы можете дать globals () для вызова exec, чтобы он добавил функцию к текущему модулю:

exec(LOC,globals()) 
1 голос
/ 22 июня 2019

В соответствии с документами для exec(object[, globals[, locals]])

https://docs.python.org/3/library/functions.html#exec

Примечание. Локальные переменные по умолчанию действуют так, как описано ниже для функции locals (): изменения в словаре локальных значений по умолчанию должныне пытатьсяПередайте явный словарь локальных, если вам нужно увидеть влияние кода на локальные объекты после того, как функция exec () вернет.


Следовательно, вам нужно передать свои собственные локальные данные как глобальные и локальные.:

mylocals = {}
exec(your_code, mylocals, mylocals)

Тогда вы можете позвонить через mylocals:

print(mylocals['factorial']())
...