我正在寻找一个示例,说明删除未使用的导入如何导致破坏其他有效的程序。我的问题受到这个问题的启发:https://github.com/psf/black/issues/86
有人可以给我举个例子吗?
当您在 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()
这很可怕吗? 是的。你应该这样做吗? 不。
你能保证其他人没有吗?
首次导入模块时,该模块中的所有代码都会运行。惯例和良好实践规定,模块不应该对环境的其余部分进行任何更改,但情况并非总是如此(例如,模块可以更改整个环境中
sys
中的几个变量)程序,首次导入时)。
有人可能纯粹因为它的副作用而导入这样的模块,然后永远不会在代码的其余部分中显式引用它。像
black
这样的 linting/格式化工具会将其检测为未使用,并将其删除,突然之间,它所具有的副作用不再有效,并且程序会因此中断。
我现在无法提出任何具体的例子,但我知道我以前至少见过一个,而且我个人一直在研究这样一个模块,直到我意识到这是一个糟糕的主意并停止了。
考虑您具有以下结构:
- root
|--folder1
|-- __init__.py
|-- server.py
|--main.py
以及以下内容:
# main.py
import folder1 as f
print("I am doing stuff but don't need f")
# __init__.py
from folder1 import server
# server.py
# Start a server, or do something else you need
当您删除
folder1
中的 main.py
导入时,它将停止在 __init__.py
和 server.py
中进行细化操作。我肯定会认为这是糟糕的代码,但这是可能的。
我不知道这是否回答了您的问题,但是如果您删除未使用的导入,则前 2 个图标将不再显示。
https://github.com/theonlycodingbear/unused-imports-problem.git
给出一种方法,这可能会导致问题,但不一定是不好的做法 - 您可以将函数导入到文件中,以便于在永恒的事情中使用(例如命令行调用)。
例如,具有以下结构:
- my_api
|--init.py
|--main.py
# main.py
def get_app():
# Do Server Stuff
# __init__.py
from my_api.main import get_app as run
然后,如果您想使用 uvicorn 来运行它,您可以这样做:
uvicorn my_api:run --reload
代替:
uvicorn my_api:main.get_app --reload
删除未使用的导入也会删除您的外部快捷方式。
我见过一些软件包,人们也做了类似的事情来组织或分组导入;然而,不太确定这在技术上是否是不好的做法,但我真的不喜欢它。它通常似乎只会增加混乱。