python - 一次导入子模块,以便它可用于所有其他子模块和顶级模块
问题描述
我的任务是研究对 Python 工具的改进。然而,目前的工具是一团糟。只是几百个函数和导入的集合,分布在同级目录中的 10 个文件中,所有文件都相互交叉引用,每个文件导入其他文件的一些子集,有时是递归的。
那里有一个底层的层次结构,所以我打算把它全部转换成一个带有子模块的模块,然后进一步将它重构为一个类而不是一组嵌套函数。
我在进口方面遇到了一些问题。我是使用 python 自学的,并且我试图保持 PEP8 兼容,但对如何操作知之甚少。另一个复杂因素是我使用的系统是安全的,并且无法在其上安装 IDE,因此我正在与内置终端的美化文本编辑器作斗争。
我以为我可以在模块的最高级别将子模块一起导入,然后它们将可用于所有子模块,但这似乎会产生名称错误。我的文件结构和代码如下:
目录
dir
|
+-- run_module.py
|
+--top_module
|
+--__init__.py
|
+--module.py
|
+--sub_module
|
+--__init__.py
|
+--sub_module_one.py
|
+--sub_module_two.py
run_module.py 的内容
from top_module import module
module.run_the_thing()
init .py的内容
目前,这两个__init__
文件都是空的,但如果top_mod.__init__
有导入而不是module
,以及导入module
和被导入,则此问题仍然存在run_module
module.py 的内容
from .sub_module import sub_module_one, sub_module_two
def run_the_thing():
sub_module_one.hello()
sub_module_two.greeting()
sub_module_one.py 的内容
def hello():
print('I am sub-module 1.')
sub_module_two.py 的内容
def hello():
print('I am sub-module 2.')
def callout():
print('And this is my friend:')
sub_module_one.hello()
def greeting():
hello()
callout()
运行时,它会sub_module_one
按预期打印输出,并打印所有内容,sub_module_two
直到调用sub_module_one
.
我不能说我对这种行为感到惊讶,但是有没有一种解决方案可以让我在顶级脚本中导入所有子模块,让它们可供所有其他人使用,或者我必须在每个和每个子模块?
显然这对我的 MWE 来说并不算太乱,但真正的代码将是可怕的意大利面条。
解决方案
推荐阅读
- parsing - 上下文相关的 ANTLR4 ParseTreeVisitor 实现
- html - CSS focus-within 显示标签
- node.js - SQS 批量大小最大限制会导致通过 Lambda 的处理速度变慢吗?
- python - 在 3D xarray 中按月数访问数据
- php - 如何使用托管在 Azure Web App 上的 Symfony 4 应用程序获取客户端 IP
- java - 为什么这个导入不能跨 Eclipse 中的包工作?
- javascript - 具有动态内容的动态附加 iframe 在内容元素上写入 jquery 事件句柄不起作用
- c++ - shared_ptr 在分配新变量时如何反应?
- python - 如何根据 x 轴上的值绘制多种颜色
- javascript - 单击模态框中的锚标记将 href 链接发送到 AJAX