Я пытаюсь установить функцию 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
я вижу, что пространство имен модуля *Кажется, 1019 * перезаписывается классом .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')