0

我开始了一个继续开发的 python 项目。它有10个本地图书馆。他们每个人都互相称呼“from name import *”。以 main 为例:

from name3 import *
from name2 import *
from general_functions import *
from messages import *
from network import *
from keyboard_functions import *
from process_functions import *
from name4 import *
from settings import *  # settings

根据 python 的 zen,显式优于隐式。同样由于理解和调试项目,我需要明确的导入方法和变量。

其他库也使用相同的导入方法。我觉得所有库都通过“*”导入所有库。

我尝试手动重构

from debug_functions import (print_log, print_log2, debug_functions_initilizer, debug_prints_abbrev, print_setting_info,
                             print_error, print_warn, print_error_warning_count_of_this_process, print_debug,
                             print_performance_report)

像这样。

但当我看得更深时,我停下了脚步。

例如 a.py 导入 exp1 库。在 b.py 中,它调用from a.py import *. 所以在b.py中,不需要import exp1就可以使用exp1库。因此,在 b.py 中,如果我转换from a.py import *为显式形式,from a.py import something则会出现依赖于 exp1 库的错误。有很多这样的例子。

我该如何解决这个问题?

更新

我做了什么?我用自己的方法导入库,每个库的变量。例如,我有 a.py、b.py 和 c.py 库。我将 a.py 和 b.py 用他们自己的所有方法导入到 c.py。像那样,

from a import foo, bar from b import exp, solv

在 b.py 中,以同样的方式, from a import foo, bar from c import sa, as

在那之后,图书馆有真正所有者的必要方法,而不是第三图书馆。

最后,我删除了库中未使用的方法。

4

1 回答 1

1

不确定是否有一个简单的解决方案,但这可能会有所帮助。安装 pylint 并在所有模块上为“未定义变量”设置测试

  1. 创建一个模块,比如“temporary.py”,并从这个地方的所有文件中获取所有“from xyz import *”。
from name3 import *
from name2 import *
from general_functions import *
from messages import *
from network import *
from keyboard_functions import *
from process_functions import *
from name4 import *
from settings import *
  1. 从所有其他模块中删除所有“从 xyx import *”并替换为单行“从临时导入 *

这将有助于防止所有模块相互依赖(因为所有模块现在都依赖于“temporary.py

  1. 现在从temporary.py 中的第一个导入“from name3 import *”开始。删除此导入并运行 pylint 测试。通过在“来自临时导入 *”之后添加隐式导入来修复所有失败的模块

  2. 对所有其他导入执行此步骤

  3. 完成后,从所有文件中删除“从临时导入 *”。

注意:有一个警告。如果 2 个模块定义了相同的变量/函数,比如“my_function”,并且模块 C 导入了两个模块,那么它使用上次导入的“my_function”。如果有的话,您将无法识别此类问题,并且最终可能会使用错误的功能。

于 2020-07-21T08:19:00.750 回答