是否可以列出模块中的所有功能?

use*_*514 34 python python-module

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

foo.py

def foo1(): pass
def foo2(): pass
def foo3(): pass
Run Code Online (Sandbox Code Playgroud)

我从另一个文件导入它:

main.py

from foo import * 
# or
import foo
Run Code Online (Sandbox Code Playgroud)

是否可以列出所有功能名称,例如["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] 
Run Code Online (Sandbox Code Playgroud)

aar*_*ing 74

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

 import inspect

 all_functions = inspect.getmembers(module, inspect.isfunction)
Run Code Online (Sandbox Code Playgroud)

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

  • 为inspect.getmembers +1! (3认同)
  • 当您不知道模块名称时,如何列出当前文件中的所有函数? (3认同)
  • 要仅包含已在该模块中定义的函数(未导入),请参阅此问题:http://stackoverflow.com/questions/1106840/find-functions-explicitly-defined-in-a-module-python (2认同)

pyf*_*unc 9

您可以使用dir来探索命名空间.

import foo
print dir(foo)
Run Code Online (Sandbox Code Playgroud)

示例:将您的foo加载到shell中

>>> 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
>>> 
Run Code Online (Sandbox Code Playgroud)

您可以使用getattr获取foo中的关联属性,并找出它是否可调用.

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

如果你这样做 - "从foo import*"那么名字就包含在你调用它的命名空间中.

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

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


Fli*_*imm 7

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

import inspect

name_func_tuples = inspect.getmembers(module, inspect.isfunction)
functions = dict(name_func_tuples)
Run Code Online (Sandbox Code Playgroud)

但是,这将包括已在别处定义但导入到该模块的命名空间中的函数

如果您只想获取已在该模块中定义的函数,请使用以下代码段:

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)
Run Code Online (Sandbox Code Playgroud)