eval не читает переменную внутри внутренней функции - PullRequest
0 голосов
/ 07 июня 2019

При использовании внутренней функции она считывает переменную, определенную во внешней функции.Но как-то не получается при использовании eval ().Похоже, это связано с тем, как работает localals () ... но я не уверен, как и почему ...

def main():
    aaa = 'print this'

    def somethingelse():
        print(locals())
        #print(aaa)
        print(eval('aaa'))
        print(locals())

    somethingelse()

main()

Приведенные выше коды не будут работать, выдавая сообщение об ошибке: File "", строка 1, в NameError: имя 'aaa' не определено

Но если снять отметку с печати (aaa), чтобы обе строки печати существовали, то обе они будут работать.

Я пытался напечатать locals () до и после этой команды print (aaa), получается, что если помечена строка print (aaa), оба locals () будут пустыми {}.Но если не отметить, то оба localals () будут {aaa: 'print this'}

Это озадачивает меня ...

1 Ответ

2 голосов
/ 07 июня 2019

Когда ваш код Python компилируется, компилятор должен делать специальные действия, чтобы локальная переменная была доступна из вложенной функции.Это замедляет весь доступ к переменной, поэтому он делает это только для тех переменных, которые, как он знает, используются во внутренней функции.Другие локальные переменные из внешней функции просто не существуют в пространстве имен внутренней функции.

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

Возможно, вы все равно не хотите использовать eval, их крайне малослучаи, когда его целесообразно использовать.

...