2

私はこれをしたくないので、私の調べるコマンドのために:

def examine(Decision):
    if Decision == "examine sword":
        print sword.text
    elif Decision == "examine gold":
        print gold.text
    elif Decision == "examine cake":
        print cake.text
    ...

私のゲームのすべてのアイテムのために。

そこで、Decision文字列の 2 番目の単語を変数に変換して、 のようなものを使用できるようにしたいと考えましたsecondwordvar.text

を使用しようとしましeval()たが、1 つの単語コマンドでスペルを間違えると、常にエラーが発生します。

エラー

IndexError: list index out of range

それ以外の場合は機能しています。

今私のコードはこれです:

def exam(Decision):
    try:
        examlist = shlex.split(Decision)
        useditem = eval(examlist[1])
        print useditem.text
    except NameError:
        print "This doesn't exist"

他のオプションについて、その関数を簡単な方法で書く方法を知っている人はいますか?

私はおそらく完全なゲームも含める必要があります。ここで見つけることができます:http: //pastebin.com/VVDSxQ0g

4

4 に答える 4

5

プログラムのどこかに、オブジェクトの名前をそれが表す変数にマッピングする辞書を作成します。例えば:

objects = {'sword': sword, 'gold': gold, 'cake': cake}

次に、examine()関数を次のように変更できます。

def examine(Decision):
    tokens = shlex.split(Decision)
    if len(tokens) != 2 or tokens[0] != 'examine' or tokens[1] not in objects:
        print "This doesn't exist"
    else:
        print objects[tokens[1]].text
于 2013-11-13T18:57:08.057 に答える
1

あなたができることは (プログラミングに関する私の知識では多少制限されているため、これが私が見ることができる最も高度な方法であるため) 辞書を利用することです。この分野のコードに関する私の知識は疑わしく、誤解を招きたくないので、英語で説明しようと思います。

辞書は非常に配列に似ており、決定を値に関連付けることができます。

Examine swordアクションコードに関連付けることができます4

これにより、(ハック的な方法で)文字列を変数に変換できます。さらに、key/valueペアを直接かつ一貫して参照することによります。

このアプローチで頑張ってください。辞書を読んでみると、思ったより扱いやすいことがわかるかもしれません。

最後に、優れたコーディング方法として、自分が何をしているのか確信eval()が持てない限り、絶対に使用しないでください。内でコードを実行するため、万が一、悪意のあるプロセスが内部に悪意のある行を挿入してそのコードを実行できたとしても、eval()()

eval(###DELETE EVERYTHING RAWR###)

あなたは悪い時間を過ごすでしょう。心から。

また、コードを評価するために、これは非常に遅いコマンドであり、パフォーマンスに関してはより良い代替手段があると聞いています。

ハッピーコーディング!

于 2013-11-13T18:58:02.150 に答える