0

我需要能够向用户询问乌龟命令,例如 forward(90) 并将其作为乌龟命令执行,例如 turtle.forward(90) 并重复直到用户退出。到目前为止,我有:

def turtle_input(prompt):
"""Loop to ask for user input and execute as a turtle command"""
import turtle
while True:
    t = input('Enter a turtle command: ')
    if t in ['Quit' , 'quit', 'q', 'Q']:
        break
    turtle.(t)     
return prompt
4

1 回答 1

0

执行任意代码通常不是一个好主意,因为它是一个巨大的安全漏洞,但这里有一种方法:

eval('turtle.{0}'.format(t))

这不是一个好主意,因为考虑用户可以传入的以下字符串:

t = 'forward(90) or __import__("os").system("rm -rf ~")'

突然之间,您的主目录开始被删除——哎呀。


一个稍微不那么健壮但更安全的解决方案可能是自己使用ast.literal_eval和解析字符串:

import ast

#...
funcname,args = t.split('(',1)
args = ast_literal_eval('('+args)
if hasattr(args,'__iter__'):
    getattr(turtle,funcname)(*args)
else:
    getattr(turtle,funcname)(args)
于 2012-11-15T21:41:15.977 回答