【问题标题】:Get symbol for def in module in Python在 Python 中获取模块中 def 的符号
【发布时间】:2012-03-23 09:17:51
【问题描述】:

我正在为一种旧的游戏内脚本语言编写解释器,因此需要编译字典,该字典具有与该函数的符号匹配的语言中的命令名称。

现在,我已经想通了:How to call a function based on list entry?

...您可以通过这种方式调用函数,而且我知道您可以使用 dir 获取模块中所有函数的字符串列表。我已经能够得到这个列表,并使用正则表达式,删除了内置命令以及我实际上不希望脚本能够调用的任何其他内容。目标是在这里沙箱。 :)

现在我有了模块中定义的项目列表,我需要获取每个定义的符号。

为了更直观的表示,这是我想要获取符号的测试模块:

    def notify(stack,mufenv):
        print stack[-1]

它是通过初始化脚本引入的,我可以使用以下方法在列表中获取通知函数的名称:

    import mufprims
    import re

    moddefs=dir(mufprims)
    primsfilter=re.compile('__.+__')
    primslist=[ 'mufprims.' + x for x in dir(mufprims) if not primsfilter.match(x) ]
    print primslist

这会返回:

    ['mufprims.notify']

...这是我希望为其查找符号的函数的确切名称。 我在这里阅读了http://docs.python.org/library/symtable.html,但我不确定我是否理解它。我认为这是我想要的关键,但我没有看到我能理解的例子。任何想法如何获得我从列表中提取的函数的符号?

【问题讨论】:

标签: python symbols sandbox


【解决方案1】:

我想我可能会为检索对象的功能添加另一个可能的建议:

import inspect

# example using os.path
import os.path
results = inspect.getmembers(os.path, inspect.isroutine)

print results

# truncated result
[...,
('splitdrive', <function splitdrive at 0x1002bcb18>), 
('splitext', <function splitext at 0x1002bcb90>), 
('walk', <function walk at 0x1002bda28>)]

在对象上使用dir 基本上会为您提供该对象的每个成员,包括不可调用的属性等。您可以使用inspect 模块来获得更可控的返回类型。

【讨论】:

    【解决方案2】:

    您想通过使用 getattr 和函数名从 mufprims 模块中获取函数。像这样:

    primslist=[getattr(mufprims, x) for x in dir(mufprims) if not primsfilter.match(x) ]
    

    【讨论】:

      猜你喜欢
      • 2017-11-23
      • 2013-04-09
      • 1970-01-01
      • 2021-08-09
      • 2014-05-13
      • 2016-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多