我用这种格式定义了一个.py文件:
def foo1(): pass
def foo2(): pass
def foo3(): pass
我从另一个文件导入它:
from foo import *
# or
import foo
是否可以列出所有功能名称,例如["foo1", "foo2", "foo3"]
?
感谢您的帮助,我为自己想要的内容上课,如果您有建议,请发表评论
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]
答案 0 :(得分:70)
最简单的方法是使用inspect模块。它有一个getmembers
函数,它将谓词作为第二个参数。您可以使用isfunction
作为谓词。
import inspect
all_functions = inspect.getmembers(module, inspect.isfunction)
现在,all_functions
将是一个元组列表,其中第一个元素是函数的名称,第二个元素是函数本身。
答案 1 :(得分:9)
您可以使用dir来探索命名空间。
import foo
print dir(foo)
示例:在shell中加载你的foo
>>> 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中的关联属性,并找出它是否可调用。
查看文档:{{3}}
如果你这样做 - “来自foo import *”,那么这些名称将包含在你调用它的命名空间中。
>>> from foo import *
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'atexit', 'foo1', 'foo2', 'foo3']
>>>
以下关于python中内省的简介可能对您有所帮助:
答案 2 :(得分:4)
尝试使用如下所示的检查模块,例如模块 - &gt; temp.py
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']
答案 3 :(得分:4)
像
aaronasterling said,您可以使用inspect
模块中的getmembers函数执行此操作。
import inspect
name_func_tuples = inspect.getmembers(module, inspect.isfunction)
functions = dict(name_func_tuples)
但是,此将包含已在其他位置定义的函数,但会导入该模块的命名空间。
如果您只想获得该模块中定义的功能,请使用以下代码段:
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)
答案 4 :(得分:2)
如果想列出当前模块的功能(即不是导入的模块),你也可以这样做:
import sys
def func1(): pass
def func2(): pass
if __name__ == '__main__':
print dir(sys.modules[__name__])
答案 5 :(得分:1)
用于狂野导入
from foo import *
print dir()
您可以在没有参数的情况下使用dir()
来显示当前模块命名空间中的对象。这很可能不仅包括foo
的内容。
如果是绝对导入(顺便说一下你可以选择),你可以将模块传递给dir()
:
import foo
print dir(foo)
同时检查documentation of dir
。由于您只需要函数,因此您可能需要考虑使用inspect.isfunction
。希望您不要将该列表用于非调试目的。