Is it possible to list all functions in a module?
本问题已经有最佳答案,请猛点这里访问。
我定义了一个.py文件,格式如下:
P.Py1 2 3 | def foo1(): pass def foo2(): pass def foo3(): pass |
我从另一个文件导入它:
Me.Py1 2 3 | from foo import * # or import foo |
是否可以列出所有函数名,如
谢谢你的帮助,我为我想要的东西做了一个班,如果你有建议,请评论。
1 2 3 4 5 6 7 8 9 10 11 12 | class GetFuncViaStr(object): def __init__(self): d = {} import foo for y in [getattr(foo, x) for x in dir(foo)]: if callable(y): d[y.__name__] = y def __getattr__(self, val) : if not val in self.d : raise NotImplementedError else: return d[val] |
最干净的方法就是使用检查模块。它有一个以谓词为第二个参数的
1 2 3 | import inspect all_functions = inspect.getmembers(module, inspect.isfunction) |
现在,
您可以使用dir来探索名称空间。
1 2 | import foo print dir(foo) |
示例:在shell中加载foo
1 2 3 4 5 6 7 8 9 10 11 12 | >>> import foo >>> dir(foo) ['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'foo1', 'foo2', 'foo3'] >>> >>> getattr(foo, 'foo1') <function foo1 at 0x100430410> >>> k = getattr(foo, 'foo1') >>> k.__name__ 'foo1' >>> callable(k) True >>> |
您可以使用getattr在foo中获取相关的属性,并找出它是否可以调用。
检查文档:http://docs.python.org/tutorial/modules.html dir函数
如果您这样做——"从foo导入*",那么名称将包含在您调用它的名称空间中。
1 2 3 4 | >>> from foo import * >>> dir() ['__builtins__', '__doc__', '__name__', '__package__', 'atexit', 'foo1', 'foo2', 'foo3'] >>> |
以下关于python自省的简短介绍可能会帮助您:
- http://www.ibm.com/developerworks/library/l-pyint.html
喜欢aaronasterling说,您可以使用来自
1 2 3 4 | import inspect name_func_tuples = inspect.getmembers(module, inspect.isfunction) functions = dict(name_func_tuples) |
但是,这将包括在其他地方定义但导入到该模块命名空间的函数。
如果只想获取该模块中定义的函数,请使用以下代码段:
1 2 3 | name_func_tuples = inspect.getmembers(module, inspect.isfunction) name_func_tuples = [t for t in name_func_tuples if inspect.getmodule(t[1]) == module] functions = dict(name_func_tuples) |
如果模块>temp.py,请尝试如下使用exmaple的inspect模块
1 2 3 4 5 6 7 8 | In [26]: import inspect In [27]: import temp In [28]: l1 = [x.__name__ for x in temp.__dict__.values() if inspect.isfunction(x)] In [29]: print l1 ['foo', 'coo'] |
如果想要列出当前模块的函数(即,不是导入的模块),也可以这样做:
1 2 3 4 5 6 | import sys def func1(): pass def func2(): pass if __name__ == '__main__': print dir(sys.modules[__name__]) |
为了一个疯狂的进口
1 2 | from foo import * print dir() |
您可以在没有参数的情况下使用
如果是绝对导入(顺便说一下,您应该更喜欢),您可以将模块传递给
1 2 | import foo print dir(foo) |
还要检查