#python #python-module #doctest #getattr
#python #python-модуль #doctest #getattr
Вопрос:
Я пытаюсь протестировать метод, который принимает объект модуля module
и строку с именем типа type_name
внутри этого модуля :
def get_type_from_string(module, type_name):
"""
>>> class A: pass
>>> A.__module__
'mymodule'
>>> get_type_from_string(sys.modules['mymodule'], 'A')
<class '__mymodule__.A'> <------ fails
"""
return getattr(module, type_name)
Когда я пытаюсь получить объект типа с getattr
помощью (на самом деле, метод делает больше, чем просто это), я получаю сообщение об ошибке:
AttributeError: module 'mymodule' has no attribute 'A'
Возможно ли документально протестировать этот метод без необходимости определять A
класс вне документа-теста?
Комментарии:
1. Как вы импортировали
mymodule
и гдеdoctest.testmod()
вызывается?
Ответ №1:
По какой-то причине defined A class
отсутствует в __dict__
. Возможно, это проблема с самим doctest. В качестве обходного пути вы можете добавить его следующим образом:
sys.modules[A.__module__].A = A
или
sys.modules[A.__module__].__dict__['A'] = A
def get_type_from_string(module, type_name):
"""
>>> import sys
>>> class A: pass
>>> A.__module__
'mymodule'
>>> sys.modules[A.__module__].A = A
>>> get_type_from_string(sys.modules['mymodule'], 'A')
<class 'mymodule.A'>
"""
return getattr(module, type_name)
Вот как я вызываю тест:
if __name__ == "__main__":
# import sys
import doctest
import mymodule
doctest.testmod(mymodule)