python - 在 Python 中制作菜单

标签 python dictionary menu

<分区>

Possible Duplicate:
Calling a function from a string with the function's name in Python

我认为我可以编写一些糟糕的代码来执行此操作,但我更愿意看到“干净的版本”。

在我看来,好的方法是制作一个包含给定对象可以使用的各种功能的字典。然后,当用户被指示告诉对象它在做什么时,它会根据该命令吐出一个菜单。

我四处搜索了一下,并没有真正看到适合我的东西,所以我想我会试一试。好吧,它没有用。

class Man(object):
    def __init__(self):
        self.cmds = ['foo', 'bar']

    def foo(self):
        print "Foo called."

    def bar(self):
        print "Bar called."

    def junk(self):
        print "Junk called." ##not in dict, on purpose, will explain

    def menu(self):
        while True:
            print "List of actions:"
            for acts in self.cmds:
                print acts
            cmd = raw_input("> ")
            if cmd in self.cmds:
                cmd()    ##doesn't work.
                         ##neither did self.cmd() (got AttributeError, obviously)

                result = getattr(self, cmd)() ## this works! thanks cdhowie
            else:
                pass

Stick = Man()
Stick.menu()

如果不是很明显,每当我输入 if-else 认为是 True 的内容时,程序都会给出 TypeError - 在这种情况下,输入“foo”或“bar”。 事情是这样的,我知道我可以在这里写一个长长的丑陋的 if-else 东西并使这个例子工作 - 但我希望能够从 self.cmds 中追加/删除以改变对象的功能。因此第三个函数 Junk(); Stick 无法从当前的字典菜单访问“Junk()”,但我希望通过一些 self.cmds.append 操作,它能够访问。

该死的 Python,它们是如何工作的?这是解决此问题的正确方法,还是有更简单的方法?

编辑:我的答案是在 getattr 的魔法中找到的。谢谢 cdhowie。诀窍是将 while 循环更改为具有此位:result = getattr(self, cmd)()

我现在知道我的下一个任务是最终弄清楚 getattr() 的实际作用。请原谅我的菜鸟身份,呵呵,我不知道我在写什么:)

最终编辑:虽然 cdhowie 的示例适用于原始程序,但我后来发现 ders 的答案允许我在功能上做一些我无法用 getattr(); 做的事情; ders 的解决方案使我更容易在 Man 的 init 中使用其他对象中的函数 - 我认为这称为“对象组合”,对吗?无论如何,getattr() 会将 AttributeError 从 Man 以外的任何地方添加到 self.cmds 的任何函数。或者我可以再次做奇怪的事情。但足以说明,ders FTW。

最佳答案

在您的示例中,Man.cmds 是一个列表而不是字典。因此,当 self.cmds 列表中的字符串作为函数调用时,会引发 TypeError。

创建一个字典,将函数名称作为与函数本身配对的字符串。

    def __init__(self):
        self.cmds = {'foo':self.foo, 'bar':self.bar}

在您的 Menu 函数中,检查用户是否输入了有效的函数名称。如果是,从字典中取出并调用它。

            if cmd in self.cmds:
                command = self.cmds[cmd]
                command()
            else:
                pass

要动态添加垃圾函数,您可以更新 cmds:

Stick.cmds.update({'junk':Stick.junk})

关于python - 在 Python 中制作菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7251819/

相关文章:

python - Jedi 没有找到项目中的所有用法

java - 在五仙词典中添加新术语

javascript - 向下滑动垂直菜单而不从子菜单水平插入

python - Shopify Python API : How to serialize products list to JSON?

Python 相当于 Scala groupby

python - 正则表达式匹配所有内容,直到模式中有异常

html - 显示重影值的子菜单

c# - 如何在字典类型 session 变量中添加逗号分隔的字符串值

python - 如何获取嵌套字典中的最大值以及包含它的键?

c# - 如何根据asp.net母版页中的用户权限从菜单中删除项目