从包中导入所有功能:"来自。* import *"

时间:2016-01-18 12:41:54

标签: python python-import

目标

我希望能够从我的包中的每个文件中导入(在__init__.py上)所有函数。

用法

例如在此文件夹结构中。

manage.py
- scripts/
   -- __init__.py
   -- tests.py
   -- deploy.py

我目前正在做以下事情:

manage.py:

from scripts import *

脚本/的初始化的.py:

from .tests import *
from .deploy import *

但是,每次我向包添加另一个文件时,我都必须在script/__init__.py上添加一个导入行,这有点烦人。

2 个答案:

答案 0 :(得分:16)

您可以手动执行此操作,但 不应该

为什么你真的不想这样做:

你最终会得到一个命名空间,在这个命名空间中,理解什么是什么以及它来自哪里将是非常困难的,随着整个项目的规模的增加而难以增加。对于完全不直观的Python,想想任何可能会查看你的代码的人,或者更糟糕的是,想想你自己在1个月后重读它而不记得发生了什么。 你生活中不需要这样做。

除此之外,您向导入器公开的任何可能与其他模块中的其他功能重叠的功能将被最新导入的功能所掩盖。例如,考虑两个包含相同函数foo()的脚本,并观察会发生什么。

>>> from scrpt1 import *
>>> foo()
Script 1
>>> from scrpt2 import *
>>> foo()
Script 2

在生活中也不需要这样做。特别是当它通过明确的方式很容易绕过时。

以下是 import this 中包含的文字中的一些相关行:

  

明确胜过隐含。

明确指出您的职能所在的地方。不要"意大利面条"你的代码。如果您选择在一个地方选择所有内容的网格,您将来会想要自己。

  

特殊情况不足以打破规则。

真的自我解释。

  

命名空间是一个很好的主意 - 让我们做更多的事情!

"更多的那些!" ,而不是更少;不要错过命名空间的精彩程度。 Python基于它们;将代码隔离在不同的命名空间中是组织代码的基础。

答案 1 :(得分:6)

  1. importlib允许您从字符串名称导入任何Python模块。您可以通过路径中的文件列表自动执行它。

  2. 使用__all__更加pythonic。请查看here了解详情。