【问题标题】:Check if my module was imported检查我的模块是否已导入
【发布时间】:2016-06-08 21:51:43
【问题描述】:

我想在模块本身被导入时触发模块内的一个函数;

根据我的测试,我似乎可以检查 __name__ 是否不是 __main__ 并将其用作解决方案;但我想知道是否有更好的方法来使用某种导入钩子?

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

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

我在这方面取得了成功;但我想知道是否有其他方法可以解决这个问题。

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

【问题讨论】:

  • 您希望每次导入时都发生这种情况,还是只在每个解释器第一次发生这种情况?
  • this的可能重复
  • @limbo 这个问题不是从正确的角度来看的;我希望从模块的角度来看。
  • @user2357112 我想修改模块中存在的一个对象,以适应它被导入的情况;并且只修改一次。
  • 顶级逻辑在导入时运行一次。各种 stdlib 包具有在导入时生成的便利助手。我相信 re、rand 和 os 会这样做。

标签: python


【解决方案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 之类的模块,但这是通向疯狂的道路,因为如果不是不可能的话,它会使单元测试和调试变得痛苦。

【讨论】:

  • 感谢您的回答;我认为我的问题不够具体。我已经对其进行了修改,希望对我正在寻找的内容更加彻底。
  • @jacob 这正是 Python 的工作方式,尤其是在测试和单元测试或实现 __main__ 的应用程序等情况下,还是我在您的问题中遗漏了其他内容?
  • @jacob 如果它看起来很愚蠢但它有效并且有人可以理解它的作用,它可能仍然很愚蠢但它有效。
猜你喜欢
  • 2015-08-09
  • 2020-01-14
  • 1970-01-01
  • 1970-01-01
  • 2020-04-03
  • 2023-03-28
  • 2017-04-24
  • 1970-01-01
相关资源
最近更新 更多