当用户想要在Python中使用import*导入所有内容时,我如何引发异常



我想禁止用户像这样导入:

from module.sub import *

这应该引发和异常,并且不让任何东西进入命名空间,除非用户导入类似以下的特定内容:

from module.sub import apples

module.sub:中

__all__ = []

它不会引发异常,但当有人执行from module.sub import *时,将不会导入任何内容module.sub仍将被初始化、添加到sys.modules和添加到本地命名空间,但module.sub中定义的名称都不会添加到命名空间。

然后您可以直接引用module.sub.apples,但不能引用apples


如果你真的想要一个例外,以让人有点困惑为代价,你可以这样做:

__all__ = ['not_defined']

然后:

>>> from module.sub import *
Traceback (most recent call last):
  File "<input>", line 1, in <module>
AttributeError: 'module' object has no attribute 'not_defined'

幸运的是,好心人把python开源了,所以你当然可以做这个

在此处下载适当的源代码https://www.python.org/downloads/source/

修改import.c,这样如果它得到splat。。。

或者修改语法以忽略splat(这也需要更改Parser

一旦你做了其中一件事,只需重新编译python,并使用新的python而不是标准的python(简单地重新编译可能会对这一步骤的复杂性产生误导)

或者更简单地在模块__init__.py中使用__ALL__ = []

最新更新