компиляция Python для Exec - PullRequest
       2

компиляция Python для Exec

0 голосов
/ 10 сентября 2011

Я использую компиляцию с exec для выполнения кода Python, указанного пользователем.Ниже приведены 2 случая, представляющие код пользователя, который необходимо скомпилировать.Код пользователя читается в строку, а затем компилируется, как показано ниже.Компиляция работает нормально для случая 1, в то время как выдает синтаксическую ошибку - «SyntaxError: неожиданный символ после символа продолжения строки» для случая 2

случай 1 (работает):

if len([1,2]) == 2:
 return True
elif len([1,2]) ==3:
 return False

случай 2(не удается):

if len([1,2]) == 2:\n return True\n elif len([1,2]) ==3:\n return False

скомпилировано как:

compile(userCde, '<string>','exec')

Есть идеи?Спасибо !!

Ответы [ 4 ]

1 голос
/ 10 сентября 2011

В случае 2 перед elif есть дополнительный пробел, который вызывает эту ошибку.Также обратите внимание, что вы можете использовать return только внутри функции, поэтому вам нужно где-то def.

1 голос
/ 10 сентября 2011

У вас есть пробел после \n перед elif, что приводит к отступу блока elif и, следовательно, синтаксической ошибке.

0 голосов
/ 10 сентября 2011

Напечатайте ваш код как print repr(code), если вы \n напечатаны как \\n вместо \n, что является источником вашей проблемы: компиляция интерпретирует \n не как конец строки, а как двасимволы: продолжение строки '\', за которым следует 'n'

0 голосов
/ 10 сентября 2011

Смотреть пробелы: я проверил следующее, и это работает:

template = "def myfunc(a):\n{0}\nmyfunc([1,2])"
code = "    if len(a) == 2:\n        return True\n    elif len(a) ==3:\n        return False"
compile(template.format(code), '<string>','exec')

дает <code object <module> at 0280BF50, file "<string>", line 1>

редактирование: знаете ли вы функцию eval()?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...