如何根据列表条目调用函数?

时间:2012-03-05 19:19:38

标签: python stack sandbox

我正在进行一项实验,我正在为旧的游戏内脚本语言实现解释器。它是一种基于第四语言的语言,所以我认为将指令(一旦经过验证和消化后)放入一个大清单就相当容易了。

一旦我在列表中得到代码,我就试图在for循环中迭代整个程序,一次处理一个指令。某些项目(如字符串)可以放在保存当前堆栈的变量上,这很容易。但是我被困在哪里就是让命令发生。

我有一大堆有效的函数列表,如果有任何指令匹配它们,我会喜欢它,它会调用相关的函数。

所以,例如,如果我有:

    "Hello, world!" notify

...代码将检查列表中的notify,然后执行notify函数。底线是:如何将字符串转换为函数名称?

5 个答案:

答案 0 :(得分:4)

您可以保留代码可以调用的函数字典,然后在需要时查找:

def notify(s):
    print(s)

d = {"notify": notify}

d["notify"]("Hello, world!")

答案 1 :(得分:0)

您可以通过 locals 进行此操作,这是一个包含当前本地符号表的字典:

locals()["notify"]()

或者 globals ,它返回一个带有globals符号表的字典:

 globals()["notify"]()

您也可以提供参数,例如:

locals()["notify"]("Hello, world!")

globals()["notify"]("Hello, world!")

答案 2 :(得分:0)

类似的东西:

import re
class LangLib(object):
    pattern = re.compile(r'"(.*?)" (.*)')
    def run_line(self, line):
        arg, command = re.match(LangLib.pattern, line).groups()
        return getattr(self, command)(arg)
    def notify(self, arg):
        print arg

然后你的引擎代码是:

parser = LangLib()
for line in program_lines:
    parser.run_line(line)

答案 3 :(得分:0)

如果您有名为dict的{​​{1}}将名称映射到函数,则可以这样执行:

commands

答案 4 :(得分:0)

创建函数名称和一些标签的字典。

之前我曾尝试过几次,效果非常好。