【问题标题】:How can A.f defined in module A get list of function defined in B if A.f was called from B如果从 B 调用 A.f,模块 A 中定义的 A.f 如何获取 B 中定义的函数列表
【发布时间】:2012-05-01 18:33:18
【问题描述】:

假设我有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 做了这样的事情。

更新感谢您的回复,但我忘了再说一个限制:我不想在A.py 中做import B

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

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

更新

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

【问题讨论】:

标签: python introspection


【解决方案1】:
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__])

【讨论】:

  • @alexanderkuk 我已经发布了一个可能适合你的想法,虽然我没有时间测试它。
  • @tapan 谢谢。我将删除免责声明。
【解决方案2】:

这实际上很容易使用the dir() function

import B

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

这给出了:

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

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

【讨论】:

  • 你不能做循环导入。
  • @NiklasB。你可以 - 尝试运行它。有用。我并不是说这是一个很好的做法,但它确实有效。
  • 真的吗?我必须检查一下,上次我需要这样的东西是不可能的。当然,如果是的话,请忽略我的评论。
  • 确实如此。我站得更正了。不过,也许你应该做filter(callable, dir(B))
  • @NiklasB。循环导入可能会遇到问题,但不会在所有情况下都产生错误。
猜你喜欢
  • 1970-01-01
  • 2013-01-04
  • 1970-01-01
  • 1970-01-01
  • 2021-08-15
  • 1970-01-01
  • 2013-07-02
  • 1970-01-01
  • 2013-03-04
相关资源
最近更新 更多