0

假设我有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.

让我试着解释一下为什么:A.py是一个运行 MapReduce 作业的库。您只需在脚本的不同端导入A并运行一些。A.f然后A.f分析您定义的功能并在服务器上执行它们。所以A.f不能导入它被调用的每个模块。

或者可以吗?函数可以知道它是从哪里调用的吗?

更新

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

2 回答 2

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__])
于 2012-05-01T18:38:05.823 回答
2

使用该dir()函数实际上很容易做到这一点:

import B

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

这使:

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

如您所见,这确实包含了模块中通常看不到的隐藏值。如果您想更具体地了解您想要的东西,请查看inspect模块

于 2012-05-01T18:36:50.003 回答