В программу, которую я пишу (текстовый рпг), я собираюсь включить «скрипты», небольшие кусочки кода, которые добавляют интерактивную функциональность в игру (например, приветствие NPC при входе в комнату). Написание собственного скриптового языка / парсера казалось довольно сложной задачей, поэтому я решил вместо этого использовать сам код Python. Он может делать все, что мне нужно из сценариев, поэтому я начал взламывать. Для простых вещей, таких как операторы print или math, exec () работает нормально. Когда у меня возникает блок, возникает проблема. Вот оно в действии:
Первый - рабочий код (из интерактивной оболочки):
>>> x = ''
>>> y = []
>>> while x != '@':
y.append(x)
x = raw_input(compile('''''', '<string>', 'exec'))
<code object <module> at 0000000002B1DBB0, file "<string>", line 1>name = 'Drew'
<code object <module> at 0000000002B1DBB0, file "<string>", line 1>print 'Hello, %s' % name
<code object <module> at 0000000002B1DBB0, file "<string>", line 1>@
>>> del x[0] # removes the empty field created by the first y.append(x)
>>> for line in y:
exec line
>>> Hello, Drew
Теперь об ошибке (снова из интерактивного приглашения):
>>> x = ''
>>> y = []
>>> while x != '@':
y.append(x)
x = raw_input(compile('''''', '<string>', 'exec'))
<code object <module> at 0000000002B1DBB0, file "<string>", line 1>name = 'Drew'
<code object <module> at 0000000002B1DBB0, file "<string>", line 1>if name == 'Drew':
<code object <module> at 0000000002B1DBB0, file "<string>", line 1>print 'Hi, %s!' % name
<code object <module> at 0000000002B1DBB0, file "<string>", line 1>else:
<code object <module> at 0000000002B1DBB0, file "<string>", line 1>print 'Greetings, stranger.'
<code object <module> at 0000000002B1DBB0, file "<string>", line 1>@
>>> del y[0]
>>> for line in y:
exec line
Traceback (most recent call last):
File "<pyshell#308>", line 2, in <module>
exec line
File "<string>", line 1
if name == 'Drew':
^
SyntaxError: unexpected EOF while parsing
Итак, как вы видите, символ: (который требуется для блоков выбора) вызывает ошибку exec. Что я могу сделать, чтобы это исправить? Я пытался обойти это часами, но я не могу понять это. Это просто невозможно?
Большое спасибо за то, что прочитали это, и я ценю всю помощь, оказанную мне.