将String转换为变量

时间:2013-11-13 18:52:16

标签: python string-conversion

对于我的检查命令,因为我不想这样做:

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 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

你能做什么(因为我的编程知识有限,这是我能看到的最先进的方法)是利用字典。我会尝试用英语解释,因为我对这个领域的代码知识是可疑的,我不想误导你。

字典非常类似于数组,允许您将决策与值相关联。

您可以将Examine sword与动作代码4

相关联

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

祝你好运;阅读一些字典,你可能会发现它们比听起来更容易处理!

最后,作为良好编码习惯的一种形式,除非您确定正在做什么,否则永远不要使用eval()eval()执行()内的代码,所以如果上帝禁止,一些恶意进程设法运行该代码并在其中注入恶意行:

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

你会度过难关。此致。

另外,为了评估代码,我听说它是​​一个非常慢的命令,并且有更好的替代方案,性能方面。

快乐的编码!

答案 2 :(得分: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")

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

答案 3 :(得分:-1)

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

globals()['sword'].text

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

getattr(object, 'sword').text

你想要捕捉坏名字的可能例外。