gpt4 book ai didi

python - 命名空间被覆盖的模块中的 Monkeypatch 函数

转载 作者:行者123 更新时间:2023-12-01 01:35:44 29 4
gpt4 key购买 nike

我正在尝试对我使用的外部模块中的函数进行 Monkeypatch,但 Monkeypatch 似乎无法访问该函数,因为模块的命名空间在导入时被覆盖。

具体来说,我使用 Bio.PDB.PDBList.PDBList我的代码中的对象( biopython 模块),我正在尝试修补 _urlretrieve Bio.PDB.PDBList 防止调用互联网,而是从本地目录获取文件,而不必模拟 PDBList 的实例方法这将需要更多的工作。但当我尝试天真时:

m.setattr("Bio.PDB.PDBList._urlretrieve", mock_retrieve)

pytest 提示:

AttributeError: 'type' object at Bio.PDB.PDBList has no attribute '_urlretrieve'

进一步检查 Bio.PDB ,我可以看到模块命名空间 .PDBList似乎被类 .PDBList.PDBList 覆盖:

# Download from the PDB
from .PDBList import PDBList

这可以解释为什么 pytest 看到 Bio.PDB.PDBList作为type没有属性的对象 _urlretrieve 。我的问题是,有没有办法让monkeypatch来修补这个“隐藏”功能?

<小时/>

PDBList的具体使用示例类:

from Bio.PDB.PDBList import PDBList

_pdblist = PDBList()

downloaded_file = _pdblist.retrieve_pdb_file('2O8B', pdir='./temp', file_format='pdb')

最佳答案

你是对的 - 因为 PDBList 类与模块 Bio.PDB.PDBList 具有相同的名称,在 import Bio.PDB.PDBList 之后code> 您将无法通过名称访问该模块(遮蔽问题)。但是,您仍然可以从加载的模块缓存和猴子补丁中获取导入的模块对象:

import sys
from unittest.mock import Mock
import Bio.PDB.PDBList

def test_spam(monkeypatch):
assert isinstance(Bio.PDB.PDBList, type)
with monkeypatch.context() as m:
m.setattr(sys.modules['Bio.PDB.PDBList'], '_urlretrieve', Mock())
...

关于python - 命名空间被覆盖的模块中的 Monkeypatch 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52413528/

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