【发布时间】:2013-05-09 10:13:47
【问题描述】:
我正在尝试将一个函数分配给另一个函数,分配的左侧可以作为字符串提供给我。例如我正在寻找的方法的主体是
def change_function_defintion(name_of_function = 'module1.function1'
, function_object):
# Can I do eval(name_of_function) = function_object ? will that work?
pass
问题:
- 如何实现这一目标?显然,如果我调用上述方法,然后调用 module.function1,我希望新函数能够被拾取。
- 我在单元测试的上下文中执行此操作,即模拟几个函数,运行测试,然后基本上“取消模拟”它们。上述方法有什么问题吗?
【问题讨论】:
-
像类一样,函数也是一等对象。您可以动态导入模块,然后将函数作为属性检索。
-
请注意,这绝对不同于“如何动态加载 Python 类”问题。我已经明确要求使用 eval 方法进行任何改进/问题,并且非常正确地指出了 python 的 MOCK 框架,它默认包含在 python 3.3 中
-
模拟没有什么特别之处。您面临的问题是通过指定导入路径的字符串导入和引用一个对象(在这种情况下是一个函数,但这与引用一个类没有什么不同)。另一个问题为您回答了该特定问题。
mock库在这方面做了完全相同的事情(参见 source code)。
标签: python python-2.7