Python 模块自动加载器?

标签 python mod-wsgi wsgi autoloader

如何自动加载保存在不同目录和子目录中的所有模块?

我看过这个answer它正在使用 __import__,但它仍然不是我想要的自动加载。

我在想类似于 PHP autoloader 的东西.更好的是 Composer autoloader .

从我目前收集的研究来看,autoloader 在 Python 中似乎不是一个流行的东西(不能确定,因为我是 Python 的新手)。自动加载在 Python 中是不被鼓励的吗?

到目前为止我的自动加载代码,

import os
import sys

root = os.path.dirname(__file__)
sys.path.append(root + "/modules")
sys.path.append(root + "/modules/User")
sys.path.append(root + "/modules/Article")

# IMPORTS MODULES
module = __import__("HelloWorld")
my_class = getattr(module, "HelloWorld")

# This is our application object. It could have any name,
# except when using mod_wsgi where it must be "application"
def application(environ, start_response):

    results = []

    helloWorld = my_class()
    results.append(helloWorld.sayHello())

    output = "<br/>".join(results)

    print output

    ...

如您所见,我仍然需要这些行来加载模块,

sys.path.append(root + "/modules")
sys.path.append(root + "/modules/User")
sys.path.append(root + "/modules/Article")

如果我有大量文件夹和子文件夹怎么办?我要把它们都列出来吗?它最终会变成一个长长的列表,不是吗?

此外,使用 __import__ 似乎与此没有太大区别,

import os
import sys

root = os.path.dirname(__file__)
sys.path.append(root + "/modules")
sys.path.append(root + "/modules/User")
sys.path.append(root + "/modules/Article")

# IMPORTS MODULES
import hello
import HelloWorld

from HelloWorld import HelloWorld

# This is our application object. It could have any name,
# except when using mod_wsgi where it must be "application"
def application(environ, start_response):

后者在我看来更漂亮、更整洁。

有什么想法吗?

最佳答案

TL;DR:忘记它并使用显式导入。

更长的答案:

Python 不是 PHP - 无论是从技术 POV 还是从设计/哲学角度。

Python 的部分哲学(又名“Python's Zen”)是“显式优于隐式”、“可读性很重要”和“面对歧义,拒绝猜测的诱惑”——这构成了一个“特性”就像 PHP 的“autoload”非常不符合 pythonic,因为 1. 它比“import mymodule”或“from mymodule import SomeName”更不明确,2. 它的可读性也更差(您不清楚名称是从哪里导入的) , 和 3. 当两个或多个模块定义相同的名称时(这在 Python 中是完全有效且很常见的),它必须尝试猜测您想要哪个(这在技术上是不可能的)。

从技术角度来看,您无法以可靠的方式在 Python 中实现这样的功能 - 参见上面的第 3 点。虽然 PHP 的 require 语句和 Python 的 import 语句可能看起来相似,但它们实际上以完全不同的方式工作,“执行模型”也完全不同。

关于Python 模块自动加载器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32068957/

相关文章:

django - 将 Nginx 设置为 Apache 的反向代理与 Apache Event MPM 的反向代理

jQuery ajax 速度 vs 直接访问速度

python - scgi和wsgi有什么区别?

python - Django View 可以先返回它的标题吗?

python - 从 URL、RE、python 中提取 Amzon ASIN

python - 删除 PyQt 中的小部件和布局

python - 新手对 mod_wsgi/apache/django 设置感到困惑

python - 除了 Javascript shell 之外,MongoDB 是否还有 Ruby Shell 或 Python Shell?

python - Django 模型表单未正确提交

python - 如何在 OPENSHIFT 上部署 Flask wsgi 应用程序