python - 为什么从同级包中导入模块被视为反模式?
问题描述
我刚开始学习如何用 Python 编码(来自 Java 背景)。
我有这个非常基本的项目结构,使用我能收集到的最简单的 MVC 形式:
myproject
controllers
__init__.py
controller.py
models
__init__.py
model.py
views
__init__.py
view.py
main.py
如果我从 view.py 开始并且我需要在它和它的控制器之间建立一个链接,我知道我必须使用导入命令来导入控制器:
from controllers import controller
我知道这是行不通的,所以我使用相对路径来尝试使其工作。
from ..controllers import controller
我也知道这不起作用,因为它不能真正看到文件夹,为了解决这个问题,我需要将 myproject 文件夹本身作为一个包。但这对我来说没有意义。
我在这里读到这种文件结构几乎是一种“反模式”。但为什么呢?MVC 通过解耦它们的功能在结构上是合理的,因此将它们分成自己的包是有意义的。
解决方案
您不能从“文件”的角度思考,而应该从包的角度思考。你的整个项目应该是它自己的包,它像任何其他包一样安装在你的 Python 环境中。这些之间没有根本区别:
from django.db import models
from myproject.controllers import controller
django
是一个全局安装的包。myproject
应该是一个全局安装的包。
如果让全局“ controllers
”模块四处浮动没有意义,那么它显然应该是更大包的一部分。
如果您愿意,您可以在包中进行相对导入,这主要是简写,如果您重命名顶级包,可能会有所帮助,但在其他方面无关紧要。
始终考虑最终将您的包发布到 PyPI 或构建一个分发到生产服务器进行安装的轮子,即使您永远不会做这些事情。
推荐阅读
- java - Tomcat 8.5.50 ErrorReportValve 不工作
- javascript - 访问 FOR LOOP 生成的克隆容器
- flutter - 如何启动一个 ScrollVIew 之后的下一个小部件?
- javascript - 安装 IJavascript 后的 Jupyter ImportError
- python - notna() 和 dropna() 有什么区别?
- rust - 如何重构 rust 代码以解决在关闭时借用该引用父级的问题?
- javascript - 前缀符号字符串计算器Javascript问题
- c - C 程序在编译和执行时跳过代码语句
- javascript - Node express API 没有响应?
- node.js - 如何在反应 js 应用程序中将错误消息记录到文件而不是浏览器中?