我正在为旧的游戏内脚本语言编写解释器,因此需要编译具有该命令名称的字典,该语言与该函数的符号匹配。
现在,我已经在这里找到了: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,但我不确定我是否明白。我认为这是我想要的关键,但我没有看到一个我能理解的例子。如何获得我从列表中提取的函数的符号?
答案 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
模块来获得更受控制的返回类型。