【问题标题】:Get type object defined inside doctest by type name通过类型名称获取在 doctest 中定义的类型对象
【发布时间】:2020-12-02 17:22:25
【问题描述】:

我正在尝试对接受模块对象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 类的情况下对该方法进行文档测试?

【问题讨论】:

  • 你是如何导入mymodule的?doctest.testmod()是在哪里调用的?

标签: python python-module doctest getattr


【解决方案1】:

由于某种原因,定义的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)

【讨论】:

    猜你喜欢
    • 2010-09-24
    • 2017-04-25
    • 2019-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多