Хотя список синтаксически правильных утверждений Python, подобных этому, похоже, дает возможность использовать eval()
, сопротивляться этому соблазну. Синтаксис здесь достаточно прост, функция с одним аргументом, что мы можем использовать re
модуль для разбора команд и выполнять только то, что, как представляется, действительные функции в отношении действительных аргументов:
import turtle
import re
redist = [ \
'seth(0)', 'forward(drawdist)', 'seth(0)', 'forward(drawdist)', \
'seth(90)', 'forward(drawdist)', 'seth(90)', 'forward(drawdist)', \
'seth(180)', 'forward(drawdist)', 'seth(180)', 'forward(drawdist)', \
'seth(270)', 'forward(drawdist)', 'seth(270)', 'forward(drawdist)' \
]
valid_functions = { \
'seth': turtle.setheading, \
'forward': turtle.forward, \
}
valid_arguments = { \
'drawdist': 50, \
}
turtle.begin_fill()
for command in redist:
match = re.match(r"^(\w+)\((\w+)\)$", command)
if match is None:
raise SyntaxError("Invalid syntax")
function, argument = match.group(1), match.group(2)
if function not in valid_functions:
raise ValueError("Invalid function")
if argument in valid_arguments:
argument = valid_arguments[argument]
elif argument.isdigit():
argument = int(argument)
else:
raise TypeError("Invalid argument")
valid_functions[function](argument)
turtle.end_fill()
turtle.hideturtle()
turtle.mainloop()
Для тех, кто хочет читать дальше , он рисует заполненный квадрат. Исключения, которые я поднимаю выше, могут быть не правильными, но дело в том, что вам нужно проверять все ошибки и вызывать исключения при попытке выполнить код, который был передан вам в виде строки.
Этот ответ не работает и не затрагивает вопрос OP. Ссылки находятся вне базы. (В вопросе OP нет колец, цветов или кругов.) Черепахи не имеют метода 'getAttr()', что вызывает исключение. – cdlane