【问题标题】:Writing a Python module that can tell when it's hit with Spyder's UMD (user module deleter)编写一个 Python 模块,可以判断它何时被 Spyder 的 UMD(用户模块删除器)击中
【发布时间】:2013-12-16 00:04:57
【问题描述】:

Spyder 的 UMD 通常对我来说非常棒,但是在编写我不想删除和重新加载的模块时,我会时不时地绊倒自己。我知道我可以通过Tools > Preferences > Console > Advanced settings > User Module Deleter 控制UMD。但我也希望能够在模块本身的代码中将我编写的某些模块标记为非 UMD 友好。

在一个完美的世界里,我只会写类似的东西

assert_no_umd()

如果模块被 UMD 命中,则会抛出异常。如果代码被模块的任何重新加载(无论是通过 UMD 还是其他方式)触发,那就没问题了。

请注意,这与Method that gets called on module deletion in Python 不同,因为该问题是关于清理数据库连接的,只需执行一次,因此可以使用atexit 完成。

【问题讨论】:

    标签: python import module reload spyder


    【解决方案1】:

    (Spyder dev here) 如果我理解正确,这将是我的assert_no_umd 函数:

    import os
    
    def assert_no_umd():
        mod = __file__
        if os.environ.get("UMD_ENABLED", "").lower() == "true":
            namelist = os.environ.get("UMD_NAMELIST", None)
            if namelist is not None:
                namelist = namelist.split(',')
                if mod not in namelist:
                     raise ValueError('UMD active!!')
    

    【讨论】:

    • 是的,谢谢——这就是我想要的。我必须进行两项更改才能应用它:1)我需要使用 __name__ 而不是 __file__ 和 2)我实际上想弄清楚调用 assert_no_umd 的模块,而不是定义 assert_no_umd 的模块是否受嗯。所以我使用mod = sys._getframe(1).f_globals["__name__"]
    • 好的,很高兴您能够使我的代码为您的目的工作! :-)
    猜你喜欢
    • 2012-12-02
    • 1970-01-01
    • 2019-11-19
    • 1970-01-01
    • 2018-12-19
    • 2021-10-16
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    相关资源
    最近更新 更多