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字符串的第二个单词转换成一个变量,这样我就可以使用类似secondwordvar.text.

我尝试使用eval(),但是当我在单个单词命令中出现拼写错误时,总是会出错。

错误

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

这将(以一种 hack-y 方式)允许您将字符串转换为变量,更多的是通过key/value对对的直接和一致的引用。

用这种方法祝你好运;阅读一些关于字典的内容,您可能会发现它们比听起来更容易处理!

最后,作为一种良好的编码实践形式,eval()除非您确定自己在做什么,否则永远不要使用。eval()执行里面的代码(),所以如果,上帝保佑,一些恶意进程设法运行该代码并在其中注入恶意行:

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

你会过得很糟糕。真挚地。

另外,为了评估代码,我听说这是一个非常的命令,并且在性能方面有更好的选择。

快乐编码!

于 2013-11-13T18:58:02.150 回答
0

这两个打印相同的文本:

使用字典:

texts = dict(sword = "wathever",
             gold = "eachever",
             cake = "whomever")

def examine_dict(decision):
    decision = decision.split()[1]
    print texts[decision]

examine_dict("examine sword")

使用对象属性(一个类):

class Texts():
    sword = "wathever"
    gold = "eachever"
    cake = "whomever"

def examine_attribute(decision):
    decision = decision.split()[1]
    text = getattr(Texts, decision)
    print text

examine_attribute("examine sword")

根据您的需要,一种方法可能比另一种更合适。然而,基于字典的方法通常更容易和更快。

于 2013-11-13T19:10:06.503 回答
-1

您的变量存储在某处的字典中。如果它们是全局变量,则 globals() 返回此字典。您可以使用它按名称查找变量:

globals()['sword'].text

如果变量作为属性存储在类中,则可以使用 getattr:

getattr(object, 'sword').text

您需要捕获可能出现的坏名异常。

于 2013-11-13T19:01:21.903 回答