假设我有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 B
中A.py
。{/ p>
让我试着解释一下原因:A.py
是一个运行MapReduce作业的库。您只需导入A
并在脚本的另一端运行一些A.f
。然后A.f
分析您定义的函数并在服务器上执行它们。因此A.f
无法导入从中调用的每个模块。
还是可以吗?功能可以知道它的来源吗?
更新
def f():
module = sys.modules['__main__']
functions = inspect.getmembers(module, inspect.isfunction)
...
答案 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。