从包中导入所有函数:"from .* import *"

Importing all functions from a package: "from .* 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 上添加一个导入行,这有点烦人。

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

  2. 使用__all__更符合pythonic。查看 here 了解更多详情。

您可以手动完成,但您不应该

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

你最终会得到一个命名空间,在这个命名空间中理解什么是什么以及它从哪里来将非常困难,而且难度会随着整个项目的规模而增加。除了对 Python 完全不直观之外,想想可能会查看您的代码的任何其他人,甚至更糟的是,想想您自己 re-reading 1 个月后却不记得发生了什么。 你生活中不需要那个。

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

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

你的生活中也不需要它。 尤其是当它很容易通过显式绕过时。


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

Explicit is better than implicit.

明确定义函数的位置。不要 "spaghetti" 您的代码。如果你选择在一个地方加入所有东西的网格,你以后会想打自己的。

Special cases aren't special enough to break the rules.

不言自明。

Namespaces are one honking great idea -- let's do more of those!

"more of those!",不少;不要错过名称空间的美妙之处。 Python 以他们为基础;将代码隔离在不同的命名空间中是组织代码的基础。