【问题标题】:Adding module to python at runtime在运行时将模块添加到 python
【发布时间】:2013-10-05 18:17:48
【问题描述】:

我有一个在脚本开头执行此操作的 python 脚本:

def initialize(module_name):
    return importlib.import_module(module_name) # import module from string

我想编写一个“模拟”模块名称的测试,如下所示:

def test():
    # assemble module at run time
    module_obj = {'name': Object, 'another_name': AnotherObject}

    # inject to the "import system"
    inject_mock_module('mymodule', module_obj)

    # assert that the import went correctly
    assert my_module_mock == initialize('mymodule')

我该怎么做?首先,具体来说,如何创建module_obj 以及如何定义inject_mock_module?这需要在 2.7+ 和 3.3+ 中都有效

【问题讨论】:

  • 你使用的是 Python 2 还是 Python 3?

标签: python metaprogramming


【解决方案1】:

使用mock library 模拟出import_module() 函数。从 Python 3.3 开始,您可以将该模块导入为 unittest.mock

try:
    # Python 3.3+
    from unittest.mock import patch
except ImportError:
    # External dependency
    from mock import patch

def test():
    module_obj = {'name': Object, 'another_name': AnotherObject}

    with patch('importlib.import_module', new=module_obj.get):
        assert initialize('name') is module_obj['name']

【讨论】:

  • 读者,请注意,此处使用的 patch() 的第二个参数是“new”,而不是更常见的“return_value”。
  • @Manur: return_value 不是mock.patch() 中的位置参数。我现在通过使用new 作为关键字参数使其更加明确,但是不可能将return_value 作为位置参数传入无论如何
猜你喜欢
  • 1970-01-01
  • 2020-03-20
  • 2018-02-02
  • 2014-06-14
  • 2011-06-02
  • 1970-01-01
  • 2013-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多