我想在导入模块本身时触发模块内部的功能;
从我测试的内容来看,似乎我可以检查__name__
是不是__main__
并将其用作解决方案;但我想知道是否有一种更好的方式与某种导入钩?
if __name__ != '__main__':
# I was imported
...
我想修改模块中存在的针对此特定情况的对象,并且只修改一次。
我已经成功了;但我想知道是否还有另一种方法可以解决这个问题。
if __name__ == '__main__':
example = 0
else:
example = 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这样的模块,但它是疯狂的途径,因为它可以使单元测试和调试变得痛苦,如果不是不可能的话。