检查我的模块是否已导入

时间:2016-06-08 21:51:44

标签: python

我想在导入模块本身时触发模块内部的功能;

从我测试的内容来看,似乎我可以检查__name__是不是__main__并将其用作解决方案;但我想知道是否有一种更好的方式与某种导入钩?

if __name__ != '__main__':
    # I was imported
    ...

我想修改模块中存在的针对此特定情况的对象,并且只修改一次。

我已经成功了;但我想知道是否还有另一种方法可以解决这个问题。

if __name__ == '__main__':
    example = 0
else:
    example = 1

1 个答案:

答案 0 :(得分:1)

Python在导入时运行顶级逻辑。可以在stdlib hashlib实现中找到示例(github暂时关闭)。 https://fossies.org/dox/Python-3.5.1/hashlib_8py_source.html#name=l00131

请注意try...except用于条件导入和从第57行开始的顶级行

57 __always_supported = ('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512')
58 
59 algorithms_guaranteed = set(__always_supported)
60 algorithms_available = set(__always_supported)

这些是在导入时创建的,而不是后续调用。它以这种方式工作的部分原因是模块是一个对象并存储在sys.modules - Py2 but same for Py3中。

编辑:为了澄清你可以使用像singletons这样的模块,但它是疯狂的途径,因为它可以使单元测试和调试变得痛苦,如果不是不可能的话。