Python 2:我如何限制"来自文件导入*"只导入定义的符号?

时间:2017-11-15 22:58:12

标签: python python-2.7 import module

在Python2中:

我们都知道__all__使用__init__.py来限制模块的导入。这允许您限制发布时导入的内容:

from some_module import *

如何对FILE(some_file.py)中的所有符号执行此操作而不生成令人讨厌的__all__列表?

假设您有一个本地defs.py,其中包含您希望在代码中使用的所有全局变量,类等。这通常发生在您重构代码和/或不希望每个符号都具有名称空间前缀和/或不需要humongo from ... import语句时。在许多情况下,您不要想要包含符号defs.py导入(可能导入本身具有您想要保留的副作用,或者您不希望符号{{1导入)

你是怎么做到的?

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 *:)
  • 的宗教斗争