当用户希望在Python中使用import*导入所有内容时,如何引发异常?

当用户希望在Python中使用import*导入所有内容时,如何引发异常?,python,Python,我想禁止用户这样导入: from module.sub import * 这将引发异常,并且不允许命名空间中出现任何内容,除非用户导入以下特定内容: from module.sub import apples 在模块.sub中: __all__ = [] 它不会引发异常,但当有人从module.sub import*导入时,将不会导入任何内容module.sub仍将被初始化、添加到sys.modules并添加到本地命名空间,但module.sub中定义的任何名称都不会添加到命名空间中 然后

我想禁止用户这样导入:

from module.sub import *
这将引发异常,并且不允许命名空间中出现任何内容,除非用户导入以下特定内容:

from module.sub import apples

模块.sub中

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

然后,您可以参考
module.sub.apples
,但不能直接参考
apples


如果你真的想要一个例外,你可以这样做,但代价是有点混乱:

__all__ = ['not_defined']
然后:

>>从module.sub导入*
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
AttributeError:“模块”对象没有“未定义”属性

幸运的是,善良的人们使python开源,因此您当然可以做到这一点

在此处下载相应的源代码

修改,以便在获取splat时引发错误

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

一旦您完成了其中一项工作,只需重新编译python并使用新的python而不是标准的python(简单地重新编译可能会对这一步骤的复杂性产生一些误导)


或者更简单地说,只需使用
\uuuuu ALL\uuuu=[]
在您的模块中
\uuuu init\uuuuuuuuuuuupy
我们都是成年人;如果他们想这么做,为什么要阻止他们?因为
子部分中有一些东西会覆盖从
模块导入的内容。如果目标是避免用户获得一些内部函数,请检查
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
变量。这就是EEM喜欢您应该在项目结构中修复的东西,而不是强加给用户。不。正如其他人所说,定义
\uuuu all\uuuu
是您的出路。大概pip安装有问题的软件包会重新编译本地python并进行必要的更改,然后为他们重新安装到/usr/bin?:)
>>> from module.sub import *
Traceback (most recent call last):
  File "<input>", line 1, in <module>
AttributeError: 'module' object has no attribute 'not_defined'