在Python2中:
我们都知道__all__
使用__init__.py
来限制模块的导入。这允许您限制发布时导入的内容:
from some_module import *
如何对FILE(some_file.py)中的所有符号执行此操作而不生成令人讨厌的__all__
列表?
假设您有一个本地defs.py
,其中包含您希望在代码中使用的所有全局变量,类等。这通常发生在您重构代码和/或不希望每个符号都具有名称空间前缀和/或不需要humongo from ... import
语句时。在许多情况下,您不要想要包含符号defs.py
导入(可能导入本身具有您想要保留的副作用,或者您不希望符号{{1导入)
你是怎么做到的?
答案 0 :(得分:0)
Python2中的一个答案(可能与Python 3不同)是在导入之后但在代码之前以及最后生成符号表。然后将__all__
定义为两组的差异:
示例:
from some_gross_package import some_gross_symbol
import another_gross_package
from some_other_gross_package import *
# Anything above this line will be ignored.
excluded_symbols = set(dir())
from some_package_I_like import a_useful_symbol
# Now start generating symbols. Note that there will be a problem
# if you re-define a symbol from the excluded zone. Don't do that.
export_this1 = 1
export_this2 = "abc"
# Put this as the last line of your file
all_symbols = set(dir())
__all__ = list(all_symbols - excluded_symbols - {'excluded_symbols'})
如上所述,如果您重新定义最初在排除集中的实际要导出的符号,则会中断。但不要这样做。
另请注意,这仅适用于本地模块中您希望一个defs.py
文件包含所有各种全局符号/类的情况(通常是因为您正在重构代码)。但这更像是使用from XYZ import *
的宗教问题。
import *
:)