首页 > 解决方案 > 为什么从同级包中导入模块被视为反模式?

问题描述

我刚开始学习如何用 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 通过解耦它们的功能在结构上是合理的,因此将它们分成自己的包是有意义的。

标签: pythonpython-3.x

解决方案


您不能从“文件”的角度思考,而应该从的角度思考。你的整个项目应该是它自己的包,它像任何其他包一样安装在你的 Python 环境中。这些之间没有根本区别:

from django.db import models

from myproject.controllers import controller

django是一个全局安装的包。myproject应该是一个全局安装的包。

如果让全局“ controllers”模块四处浮动没有意义,那么它显然应该是更大包的一部分。

如果您愿意,您可以在包中进行相对导入,这主要是简写,如果您重命名顶级包,可能会有所帮助,但在其他方面无关紧要。

始终考虑最终将您的包发布到 PyPI 或构建一个分发到生产服务器进行安装的轮子,即使您永远不会做这些事情。


推荐阅读