39

我以这种格式定义了一个 .py 文件:

foo.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] 
4

6 回答 6

79

做这些事情的最干净的方法是使用检查模块。它有一个getmembers将谓词作为第二个参数的函数。您可以isfunction用作谓词。

 import inspect

 all_functions = inspect.getmembers(module, inspect.isfunction)

现在,all_functions将是一个元组列表,其中第一个元素是函数的名称,第二个元素是函数本身。

于 2010-10-28T07:30:51.007 回答
10

您可以使用 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 中的关联属性并确定它是否可调用。

检查文档:http ://docs.python.org/tutorial/modules.html#the-dir-function

如果你这样做 - “from foo import *”,那么这些名称将包含在你调用它的命名空间中。

>>> from foo import *
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'atexit', 'foo1', 'foo2', 'foo3']
>>> 

以下关于 python 内省的简介可能会对您有所帮助:

于 2010-10-28T07:17:06.727 回答
8

就像 aaronasterling 所说,您可以使用模块中的getmembers函数inspect来执行此操作。

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)
于 2013-04-04T14:02:11.140 回答
4

如果模块 --> 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']
于 2010-10-28T07:38:23.743 回答
2

对于野生进口

from foo import * 
print dir()

您可以dir()不使用参数来显示当前模块命名空间中的对象。这很可能不仅仅包括foo.

如果是绝对导入(顺便说一下,您应该更喜欢),您可以将模块传递给dir()

import foo
print dir(foo)

还要检查. dir由于您只需要函数,因此您可能需要考虑使用inspect.isfunction. 希望您不要将该列表用于非调试目的。

于 2010-10-28T07:19:39.903 回答
2

如果想列出当前模块的功能(即,不是导入的),你也可以这样做:

import sys
def func1(): pass
def func2(): pass

if __name__ == '__main__':
    print dir(sys.modules[__name__])
于 2013-10-02T14:49:17.683 回答