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

问题描述 投票:0回答:5

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

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

python python-3.x dynamic import
5个回答
8
投票

当您在 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()

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

你能保证其他人没有吗?


2
投票

首次导入模块时,该模块中的所有代码都会运行。惯例和良好实践规定,模块不应该对环境的其余部分进行任何更改,但情况并非总是如此(例如,模块可以更改整个环境中

sys
中的几个变量)程序,首次导入时)。

有人可能纯粹因为它的副作用而导入这样的模块,然后永远不会在代码的其余部分中显式引用它。像

black
这样的 linting/格式化工具会将其检测为未使用,并将其删除,突然之间,它所具有的副作用不再有效,并且程序会因此中断。

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


0
投票

考虑您具有以下结构:

- 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
中进行细化操作。我肯定会认为这是糟糕的代码,但这是可能的。


0
投票

我不知道这是否回答了您的问题,但是如果您删除未使用的导入,则前 2 个图标将不再显示。

https://github.com/theonlycodingbear/unused-imports-problem.git


0
投票

给出一种方法,这可能会导致问题,但不一定是不好的做法 - 您可以将函数导入到文件中,以便于在永恒的事情中使用(例如命令行调用)。

例如,具有以下结构:

- 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 

删除未使用的导入也会删除您的外部快捷方式。

我见过一些软件包,人们也做了类似的事情来组织或分组导入;然而,不太确定这在技术上是否是不好的做法,但我真的不喜欢它。它通常似乎只会增加混乱。

© www.soinside.com 2019 - 2024. All rights reserved.