【问题标题】:How to call every function in an imported python module如何调用导入的python模块中的每个函数
【发布时间】:2015-04-18 16:37:34
【问题描述】:

我编写了一个程序来创建和维护一个数组,并且我编写了另一个模块,该模块具有操作数组的功能。是否可以调用导入模块中的每个函数而不必对每个函数调用进行硬编码?意思是这样的:

#Some way I don't know of to get a list of function objects
    listOfFunctions = module.getAllFunctions()

    for function in listOfFunctions:
        array.function()

我想这样做,这样我就不必每次向我的操作模块添加一个函数时都更新我的主文件。

我找到了这些:

How to call a function from every module in a directory in Python?

Is it possible to list all functions in a module?

listing all functions in a python module

而且只发现在 python 文档的模块中列出了函数。 我可以想办法使用一些字符串操作和 eval() 函数来做到这一点,但我觉得必须有一个更好、更 Pythonic 的方式

【问题讨论】:

  • 这在某些单元测试中听起来像是一种非常脆弱的破解方式。如果这就是您所追求的,为什么不连接一个合法的单元测试框架呢?否则我不太明白你的意图是什么。
  • @Cyber​​ 我没有将它用于测试目的,所以我不追求单元测试框架。如果有什么我不会对我正在导入的模块中的实际功能运行单元测试以确保它们正常运行?
  • 我会在我的模块中创建一个列表,然后当我在其中创建一个函数时,在函数的范围内我会将它添加到列表中。这样,辅助函数不需要在列表中。然后 getAllFunctions 将返回列表。

标签: python function module callback python-import


【解决方案1】:

我想你想做这样的事情:

import inspect

listOfFunctions = [func_name for func_name, func in module.__dict__.iteritems()\
                  if inspect.isfunction(func)]

for func_name in listOfFunctions:
    array_func = getattr(array, func_name)
    array_func()

【讨论】:

    【解决方案2】:

    导入模块时,__dict__ 属性包含模块中定义的所有内容(变量、类、函数等)。您可以对其进行迭代并测试该项目是否为函数。例如,这可以通过检查 __call__ 属性来完成:

    listOfFunctions = [f for f in my_module.__dict__.values()
                       if hasattr(f,'__call__')]
    

    然后,我们可以通过调用__call__ 属性来调用列表中的每个函数:

    for f in listOfFunctions:
        f.__call__()
    

    但要小心!字典没有保证的顺序。这些函数将以某种随机顺序调用。如果顺序很重要,您可能希望使用强制执行此顺序的命名方案(fun01_do_something、fun02_do_something 等)并首先对字典的键进行排序。

    【讨论】:

    • 这可能是我写过的最骇人听闻的 Python 之一。小心行事。
    猜你喜欢
    • 1970-01-01
    • 2020-04-23
    • 2022-07-26
    • 2020-04-18
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    • 2020-09-17
    相关资源
    最近更新 更多