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

0 投票
2 回答
1277 浏览
提问于 2025-04-18 17:32

我正在尝试创建自己的文字游戏,按照《学习Python的艰难之路》第45章的指示,但我遇到了一些困难。我已经设置了自己的物品清单系统,现在我需要弄清楚如何在用户输入“inventory”(物品清单)时显示物品列表(我还想对“help”(帮助)做类似的事情)……我知道我可以在每次输入后加一个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")

这是我在输入“inventory”时用来调用它的代码:

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

2 个回答

0

你可以为每个有效的用户输入创建一个函数,比如说库存管理。

然后,你可以这样做:

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

这将会调用

def inventory(self, ...):
    pass
0

你可以用字典配合 lambda 函数,这样做既简洁又快速。

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() 的形式。

对于 lambda 函数,你也可以这样做。

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,因为它们有点复杂,抱歉让你困惑了。之前,如果你看看你的 if/elif/else 结构,else 语句是没办法被调用的,所以我稍微修改了一下,希望它能按照你想要的方式运行。另外,inventory 和 rock 是全局变量吗?如果不是,你需要在函数里声明或引用它们。(不过作为未来的建议,尽量避免使用全局变量通常是个好主意。)


嗯……我猜你是指像石头这样的物品。

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

你可以把 Items 设为全局变量,这样你就可以在任何地方访问它。现在这样做可以,但随着你学习,通常应该尽量避免使用全局变量。

撰写回答