0

假设我有以下 python 文件结构:

\function_group
     |-__init__.py
     |-sub_function1
     |----|__init__.py
     |----|sub_sub_func1.py
     |----|sub_sub_func2.py
     |----|sub_sub_func3.py 
     |-sub_function2
     |----|__init__.py
     |----|sub_sub_func1.py
     |----|sub_sub_func2.py
     |----|sub_sub_func3.py 

在每个sub_sub_funcX.py函数列表中都会收集所有函数名sub_sub_funcX.py

# sub_sub_funcX.py  
# and each sub_sub_funcX.py file has similiar code

import inspect 
functions = inspect.getmembers(self?, inspect.isfunction)   # how to write the "self" here

def bar(x, y):
    return x * y

def bar1(x, y):
    return x + y

我的问题是

  1. 在上面标记的代码上"# how",点 self 的正确表达是什么?它应该是一个"sub_sub_funcX"吗?

  2. 导入顶级模块时如何获得所有这些[功能]的完整列表function_group?我的意思是每个 sub_function 模块是否有可能在导入时以某种方式将其功能列表报告到顶部?

  3. 有没有一种方法可以轻松扩展模块而无需添加内务代码,__init__只需简单挂钩和易于删除?例如,我稍后更改这样的结构:

\function_group
     |-__init__.py
     |-sub_function1
     |----|__init__.py
     |----|sub_sub_func1.py
     |----|sub_sub_func2.py
     |----|sub_sub_func3.py 
     |-sub_function2
     |----|__init__.py
     |----|sub_sub_func1.py
     |----|sub_sub_func2.py
     |----|sub_sub_func3.py 
     |----|sub_sub_func4.py            # new added
     |-sub_function3                   # new added    
     |----|__init__.py                 # new added
     |----|sub_sub_func1.py            # new added

     |----|sub_sub_sub_function_31     # new sub added    
     |--------|__init__.py             # new added
     |--------|sub_sub_sub_sub_func1.py# new added
4

1 回答 1

1

1:你需要

import inspect
import sys
inspect.getmembers(sys.modules[__name__], inspect.isfunction)

2:我能想到的最佳答案是导入子模块,并在顶层检查它们。

  1. 不,责任在于顶级包(导入的包)来完成它需要做的事情。您不能导入顶级包并期望子包做他们的事情,除非它们是在顶级包中导入的。而且由于您不想修改顶级init .py,因此不会发生这种情况。

你能告诉我们你想用这些功能做什么吗?我感觉必须有这么多的内省更好的方法。

于 2010-11-01T07:06:16.643 回答