如何将用户输入转换为全局函数? (蟒蛇)

时间:2014-08-16 23:26:50

标签: python python-2.7 global raw-input

我正在尝试创建自己的文本游戏,正如学习Python艰难之路的Ex 45中的指示,但我有点卡住了。我有自己的库存系统设置,我需要弄清楚如何在用户输入“库存”时显示库存清单(我也想为“帮助”做类似的事情)...我知道我可以在每个raw_input之后为它添加一个if语句,但是我想看看是否有一些全局函数或代码可以用来让我更轻松。

我进行了搜索和搜索,但我不知道如何说出问题或我可以做些什么来解决这个问题。这是我的库存设置,我用它来调用它:

class Item(object):
 def __init__(self, name, quantity=1):
    self.name = name
    self.raw = name.strip().lower()
    self.quantity = quantity

 def recalc(self):
    self.netValue = self.quantity * self.value

class Container(object):
 def __init__(self, name):
    self.name = name
    self.inside = {}

 def __iter__(self):
    return iter(self.inside.items())

 def __len__(self):
    return len(self.inside)

 def __contains__(self, item):
    return item.raw in self.inside

 def __getitem__(self, item):
    return self.inside[item.raw]

 def __setitem__(self, item, value):
    self.inside[item.raw] = value
    return self[item]

 def add(self, item, quantity=1):
    if quantity < 0:
        print "ERROR."
    if item in self:
        self[item].quantity += quantity
        self[item].recalc()
    else:
        self[item] = item           

inventory = Container("Inventory")

这就是我在输入广告资源时使用的名称:

print "Inventory: [" + ",".join((item[1].name for item in inventory)) + "]"

2 个答案:

答案 0 :(得分:0)

你可以使用与lambdas结合的字典,这将是紧凑而快速的

from __future__ import print_function

#store commands
inputLookup = {"Inventory" : lambda: print ("Inventory: [" + ",".join((item[1].name for item in inventory)) + "]"), "other text" : lambda: 3} #and so on

text = input() #replace with hover you get input
inputLookup[text]()  # call the function from dictionary at that command

导入会将所有打印语句更改为print()。 对于lambdas,你也可以这样做。

def f():
    print "Inventory: [" + ",".join((item[1].name for item in inventory)) + "]"

inputLookup = {"Inventory": lambda: f()}
text = input()
try:
    inputLookup[text]
except:
    print "that is not a valid input" #or something

这将允许您使用旧的打印声明


是的,你不应该以这种方式对同一个函数使用递归,你将生成一个大堆栈。此外,那些印刷声明在一个奇怪的地方。

def func1():
    print "Uh oh."
    print "You're outside the house and it's quiet."
    print "You EXAMINE and find a ROCK."
    While True:
        userinput1 = raw_input(">>> ")
        if userinput1 == "inventory":
            print "Inventory: [" + ",".join((item[1].name for item in inventory)) + "]"
        elif userinput1 == "pick up": 
            if rock not in inventory:       # so they can't pick up infinite rocks   
                inventory.add(rock)
                print "You picked up a ROCK."
            else:
                print "you've already picked up the rock"
        elif userinput1 == "examine":
            print "Man's best friend."
        else:
            print "Let's go on about our way then."
            break

我没有看到你刚开始。我暂时远离lambda's,因为他们有点先进,对于混乱感到抱歉。以前,如果你看一下你的if / elif / else树,就没有办法调用else语句,所以我编辑了一下,希望它能按照你的意图运行。还有库存和摇滚全球?如果不是,你需要在函数中声明或引用它们。 (虽然作为未来的注释,从全局变量中保持一种方式通常是好的)


嗯...我认为你的意思是像摇滚等物品。

Items = {'rock': Rock(), 'item2': Item2(), 'item3' : item3()} #where Item() is creating the object
Inventory.add(Items[itemname]) # adds the item

您可以将项目设为全局项目,以便随时随地访问它。现在这是好的,但是正如你所知,你应该远离全局。

答案 1 :(得分:0)

您可以为每个有效的用户输入创建一个功能,例如广告资源

然后,你可以这样做:

input = raw_input('...')
self.method = getattr(<your class>, input)
self.method()

将调用

def inventory(self, ...):
    pass