gpt4 book ai didi

python - 如何记录在代码块中执行的所有导入?

转载 作者:太空宇宙 更新时间:2023-11-03 11:08:39 24 4
gpt4 key购买 nike

我正在编写一个测试套件,而我正在测试的代码过度使用了延迟模块导入。因此,对于同一个方法有 5 个不同的输入,这可能最终会导入 5 个额外的模块。我希望能够做的是设置测试,以便我可以断言使用一个输入运行该方法会导致一个导入,而不会导致其他 4 个导入。

我有一些关于如何着手的想法,但到目前为止都没有成功。我已经有一个自定义导入器,我可以将日志记录代码放在导入器中。但这不起作用,因为导入语句只运行一次。无论之前是否导入了模块,我都需要执行日志语句。只是运行 del sys.modules['modname'] 也不起作用,因为它在测试代码中运行,我无法在被测试的代码中重新加载模块。

我尝试的下一件事是子类化 dict 来进行监控,并用这个子类替换 sys.modules。这个子类有一个重新实现的__getitem__方法,但是调用import module似乎并没有触发子类中的__getitem__调用。我也不能直接分配给 sys.modules.__getitem__,因为它是只读的。

我正在尝试做的事情是否可行?

更新

nneonneo 的答案似乎只有在 logImports() 的实现与使用它的模块位于同一模块中时才有效。如果我创建一个包含此功能的基础测试类,它就会出现问题。首先是它不能只找到 __import__,错误为:

#     old_import = __import__
# UnboundLocalError: local variable '__import__' referenced before assignment

当我将其更改为 __builtin__.__import__ 时,出现另一个错误:

我的单元测试.py:

import unittest
class TestCase(unittest.TestCase):
def logImports(self):
old_import = __builtins__.__import__
def __import__(*args, **kwargs):
print args, kwargs
return old_import(*args, **kwargs)

__builtins__.__import__ = __import__

测试.py:

import myunittest
import unittest
class RealTest(myunittest.TestCase):
def setUp(self):
self.logImports()
def testSomething(self):
import unittest
self.assertTrue(True)
unittest.main()

# old_import = __builtins__.__import__
# AttributeError: 'dict' object has no attribute '__import__'

最佳答案

尝试

old_import = __import__
def __import__(*args, **kwargs):
print args, kwargs
return old_import(*args, **kwargs)

__builtins__.__import__ = __import__

这会完全覆盖 __import__,允许您监控 import 的每次调用。

关于python - 如何记录在代码块中执行的所有导入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12467883/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com