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

任意のコードを実行することは、セキュリティ上の大きな脆弱性であるため、通常はお勧めできませんが、次の1つの方法があります。

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 に答える