我想禁止用户像这样导入:
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(简单地重新编译可能会对这一步骤的复杂性产生误导)