【问题标题】:How to call a function based on list entry?如何根据列表条目调用函数?
【发布时间】:2012-03-23 06:36:06
【问题描述】:

我目前正在进行一项实验,我正在为旧的游戏内脚本语言实现解释器。这是一种基于第四种语言的语言,所以我认为将说明(一旦经过验证和清理)放入一个大列表是相当容易的。

一旦我将代码放入列表中,我将尝试在一个 for 循环中迭代整个程序,该循环一次处理一条指令。某些项目,如字符串,可以放在保存当前堆栈的变量上,这很容易。但我卡住的地方是让命令发生。

我有一个很大的有效函数列表,如果有任何指令匹配它们,我希望它在哪里调用相关函数。

例如,如果我有:

    "Hello, world!" notify

...代码将检查列表中的通知,然后执行通知功能。底线是:如何将字符串翻译成函数名?

【问题讨论】:

  • 所以你想让"Hello, world!" notify 表现得像notify("Hello, world!")
  • 嗯,它实际上会调用 notify 函数,该函数将获取堆栈变量并从其中弹出所需的项目以执行通知,但或多或​​少是的。
  • 我不熟悉 Python 中的正则表达式使用,但看起来您必须将字符串与引号中的所有内容(唯一)匹配,并确保检查转义引号。然后,您将使用捕获组来确定要调用的函数。解析总是很麻烦。

标签: python stack sandbox


【解决方案1】:

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

我已经试过好几次了,效果很好。

【讨论】:

    【解决方案2】:

    类似:

    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】:

      如果您有一个名为 commandsdict 将名称映射到函数,您可以这样做:

      def my_notify_function():
          print(stack.pop)
      
      commands = {'notify': my_notify_function, ...}
      
      for item in program:
          if item in commands:
              commands[item]()
          else:
              stack.push(item)
      

      【讨论】:

        【解决方案4】:

        您可以通过 locals 来完成,这是一个包含当前本地符号表的字典:

        locals()["notify"]()
        

        或者虽然 globals 返回一个带有全局符号表的字典:

         globals()["notify"]()
        

        你也可以给出论据,例如:

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

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

        【讨论】:

        • 我可以创建自己的符号表吗?我不希望用户能够运行任何命令。
        • locals()globals() 返回字典,因此您可以自己制作。
        • 是的@strcat 是对的。您可以使用这个接口:docs.python.org/library/symtable.html#module-symtable 来检查这些符号表。
        【解决方案5】:

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

        def notify(s):
            print(s)
        
        d = {"notify": notify}
        
        d["notify"]("Hello, world!")
        

        【讨论】:

        • 那不就是调用通知函数并将其结果放入该字典的值中吗?
        • python 中的函数是第一类对象,notify 只是绑定到该函数的名称(试试代码,它按原样运行)。
        猜你喜欢
        • 2019-04-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多