对于我的检查命令,因为我不想这样做:
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
答案 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
你想要捕捉坏名字的可能例外。