如果从B调用A.f,模块A中定义的A.f如何得到B中定义的函数列表

时间:2012-05-01 18:33:19

标签: python introspection

假设我有B.py

import A

def F():
    pass

def G():
    pass

if __name__ == '__main__':
    A.f()

当我运行它时,我希望A.f输出B.py中定义的函数列表

./B.py
['F', 'G']

问题是我应该在A.py写一下什么?

def f():
    ???

似乎有可能因为doctest做了类似的事情。

更新感谢您的回复,但我忘了再提一个限制:我不想在import BA.py。{/ p>

让我试着解释一下原因:A.py是一个运行MapReduce作业的库。您只需导入A并在脚本的另一端运行一些A.f。然后A.f分析您定义的函数并在服务器上执行它们。因此A.f无法导入从中调用的每个模块。

还是可以吗?功能可以知道它的来源吗?

更新

def f():
    module = sys.modules['__main__']
    functions = inspect.getmembers(module, inspect.isfunction)
    ...

2 个答案:

答案 0 :(得分:3)

def f():
    import B
    import inspect

    functions=inspect.getmembers(B,inspect.isfunction)

http://docs.python.org/library/inspect.html#inspect.getmembers

修改

我没有尝试过,但似乎你可以将模块作为参数传递给f并使用它。

def f(mod):
    import inspect
    functions=inspect.getmembers(mod,inspect.isfunction)
    return functions

然后,从B,你可以做类似的事情:

import sys
import A
myfuncs=A.f(sys.modules[__name__])

答案 1 :(得分:2)

使用the dir() function实际上很容易做到:

import B

def f():
    print(dir(B))

给出了:

['A', 'F', 'G', '__builtins__', '__cached__', '__doc__', '__file__', '__name__', '__package__']

如您所见,这确实包含您通常看不到的模块中存在的隐藏值。如果您想更加具体地了解所需内容,请查看the inspect module