在Python中获取def模块中的符号

时间:2012-03-05 21:44:48

标签: python symbols sandbox

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

现在,我已经在这里找到了:How to call a function based on list entry?

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

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

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

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

它是通过init脚本引入的,我可以使用以下命令在列表中获取通知函数的名称:

    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,但我不确定我是否明白。我认为这是我想要的关键,但我没有看到一个我能理解的例子。如何获得我从列表中提取的函数的符号?

2 个答案:

答案 0 :(得分:2)

您希望通过使用getattr和函数名称从mufprims模块获取该函数。像这样:

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

答案 1 :(得分:2)

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

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模块来获得更受控制的返回类型。