确定将哪个类实现导入模块

时间:2014-09-24 12:49:15

标签: python python-2.6

我希望对以下内容进行单元测试:

import sys
if sys.platform == "darwin":
    import OSX.Leap as Leap
elif 'linux' in sys.platform:
    import Linux.Leap as Leap

如果我在测试中导入了OSX.Leap或Linux.Leap,如何确定?换句话说,我如何知道我已将哪个版本的Leap类添加到模块中?

更新

如果我使用inspect我可以获得:

<module 'Linux.params' from 'Linux/params.pyc'>

有:

inspect.getmodule(Leap)

2 个答案:

答案 0 :(得分:1)

您可以使用__name__属性

访问模块的名称
>>> import cStringIO as c
>>> c.__name__
'cStringIO'
>>> import StringIO as c
>>> c.__name__
'StringIO'

对于你的情况:

if 'Linux' in module_to_test.Leap.__name__:
    # Linux ...

替代方案是使用__file__属性。但它不适用于某些模块(例如C扩展模块)

更新根据OP的评论,Leap不是模块,而是模块内的类/类型。

您可以使用类的__module__属性访问模块名称。

Leap.__module__

或者,正如您在更新的问题中所做的那样,使用inspect.getmodule获取模块:

inspect.getmodule(Leap).__name__
inspect.getmodule(Leap).__file__

答案 1 :(得分:1)

Leap.__name__中提供了导入的模块的名称。标准库中的一个示例:

>>> import os.path
>>> os.path.__name__

'posixpath'

os.path模块类似,因为它是一个包装器,用于导入特定于平台的模块以实现通用API。

但是,如果Linux.LeapOSX.Leap的{​​{1}}属性值相同,则会出现问题。在这种情况下,您只需再次检查__name__的值,以了解导入了哪个模块。