Python模块自动加载器?

10 浏览
0 Comments

Python模块自动加载器?

如何自动加载存储在不同目录和子目录中的所有模块?\n我看到了这个答案,它使用了__import__,但这仍然不是我心目中的自动加载方式。\n我考虑的是类似于PHP自动加载器。更好的是像Composer自动加载器那样的东西。\n目前从我收集到的研究中看来,自动加载器在Python中似乎并不流行(由于我是Python新手,无法确定)。在Python中,自动加载是不被鼓励的吗?\n到目前为止,我的自动加载代码如下:\n

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")
# 导入模块
module = __import__("HelloWorld")
my_class = getattr(module, "HelloWorld")
# 这是我们的应用对象。它可以有任何名称,
# 除非使用mod_wsgi,此时必须为"application"
def application(environ, start_response):
    results = []
    helloWorld = my_class()
    results.append(helloWorld.sayHello())
    output = "".join(results)
    print output
    ...

\n正如你所看到的,我仍然需要这些行来加载模块:\n

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

\n如果我有大量的文件夹和子文件夹,我需要列出它们吗?这最终会变成一个很长的列表,不是吗?\n此外,使用__import__似乎与以下代码没有太大区别:\n

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")
# 导入模块
import hello
import HelloWorld
from HelloWorld import HelloWorld
# 这是我们的应用对象。它可以有任何名称,
# 除非使用mod_wsgi,此时必须为"application"
def application(environ, start_response):

\n后者对我来说看起来更好更整洁。\n有什么想法吗?

0
0 Comments

Python模块自动加载器的原因是因为Python中像PHP那样实现自动源代码重新加载是不实际的。为了解决这个问题,可以阅读以下链接的内容:https://code.google.com/p/modwsgi/wiki/ReloadingSourceCode。在那里可以找到使用mod_wsgi的自动代码重新加载的详细信息。但是,绝对不能在生产系统上使用它。如果你正在进行开发,可能最好使用mod_wsgi-express,参考:https://pypi.python.org/pypi/mod_wsgi。mod_wsgi-express具有--reload-on-changes选项,可以为您实现自动代码重新加载。PHP的自动加载器与重新加载源代码无关,它是用于自动包含其他PHP文件的。

0
0 Comments

Python模块自动加载器的出现原因是因为有些程序员在工作中经常需要导入相同的模块,这是一项重复性的任务。他们希望避免这种重复性的工作,专注于更重要的事情。在使用框架时,常常需要在控制器中导入模型等常见模式。Rails框架已经很好地解决了这个问题,但是只是告诉我们不要使用这个功能并不是一个好的答案。一种常见的解决方法是使用短别名导入模块,例如from . import models as m。这种方法解决了99%的情况。一个好的导入器将是非常好的解决方案。

然而,Python并没有提供一种可靠的方式来实现这样的功能。从技术角度来看,这是不可能的。Python的模块导入机制与PHP的require语句完全不同,执行模型也完全不同。在Python中,如果两个或多个模块定义了相同的名称(这在Python中是完全有效且很常见的),它将无法确定你想要导入哪个模块。

另外,根据Python的设计哲学,"显示优于隐式","可读性至关重要","面对模棱两可,拒绝猜测的诱惑",PHP的"autoload"功能在Python中是不符合这些原则的。

有人可能会认为自动加载功能会让你在阅读代码并尝试找出其来源时浪费时间。但是现在几乎每个IDE都包含了"跳转到定义"的功能,你不需要担心这个问题,可以将所有的精力都放在编写真正重要的代码上。

总之,虽然Python模块自动加载器在某些情况下可能会节省一些时间和输入,但长远来看,这种"魔法"解决方案往往会浪费更多的时间(在找出某个类或函数的定义位置时),而不如通过正确设置环境(以避免涉及sys.path)并编写一些明确的导入语句来提高调试效率。在我看来,能够快速调试远比每隔一段时间节省几秒钟和几次按键更重要。

最后,Rails框架的约定和规则让人很容易找到某个东西的定义位置。我同意调试时间比节省打字时间更重要,但这种自动加载功能仍然是有益的。并没有什么魔法,一切都遵循严格和可预测的规则。

0