Получить объект типа, определенный внутри doctest, по имени типа

#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)