“删除未使用的导入”的示例在 python 中会产生不良副作用吗?

nz_*_*_21 6 python import dynamic python-3.x

我正在寻找一个示例,说明删除未使用的导入如何导致破坏其他有效的程序。我的问题受到这个问题的启发: https ://github.com/psf/black/issues/86

有人可以给我举个例子吗?

Jon*_*tts 7

当您在 Python 中导入模块时,您将执行该文件中的所有代码(及其所有导入)。

按照惯例,只有此代码是无副作用的,并且通常只提供类等,但没有真正的理由这必须是真的。编写得不好的模块可能会执行必要的步骤,以作为导入期间触发的代码的一部分正常运行。

例如,完全有可能有如下代码:

# my_db/init.py
    from my_db.core import MyDB

    MyDB.do_very_important_setup()


# my_db/other.py
    import my_db.init
    from my_db.core import MyDB

    MyDB.do_some_work_assuming_setup_has_occurred()
Run Code Online (Sandbox Code Playgroud)

这很可怕吗?是的。你应该这样做吗?

你能保证别人没有吗?


Gre*_*Guy 2

当模块第一次被导入时,该模块中的所有代码都会运行。惯例和良好实践规定,模块不应对sys环境的其余部分进行任何更改,但情况并非总是如此(例如,模块可以更改整个程序的几个变量,当它第一次使用时)进口)。

有人可能纯粹是为了它的副作用而导入这样的模块,然后永远不会在代码的其余部分中显式引用它。然后,类似的 linting/格式化工具black会将其检测为未使用,并将其删除,突然间,它所具有的副作用不再有效,并且程序会因此中断。

我现在无法提出任何具体的例子,但我知道我以前至少见过一个,而且我个人一直在研究这样一个模块,直到我意识到这是一个糟糕的主意并停止了。