如何在iPython中从命名空间隐藏导入的模块?

如何在iPython中从命名空间隐藏导入的模块?,python,Python,使用此简单模块: #!/usr/bin/python #file: foo.py import ctypes class Foo(ctypes.Structure): pass 在iPython: In [1]: import foo In [2]: foo. Foo ctypes ctypes是模块内部使用的模块foo,不应向用户显示。目标是隐藏ctypes,使其不被ipython 这个解决方案是否太麻烦 import ctypes as __ctypes 我通常用这个。您的代码

使用此简单模块:

#!/usr/bin/python
#file: foo.py
import ctypes

class Foo(ctypes.Structure):
   pass
在iPython:

In [1]: import foo
In [2]: foo.
Foo
ctypes
ctypes
是模块内部使用的模块
foo
,不应向用户显示。目标是隐藏
ctypes
,使其不被
ipython

这个解决方案是否太麻烦

import ctypes as __ctypes
我通常用这个。您的代码将类似于:

import ctypes

# Note here
___all__ = []

class Foo(ctypes.Structure):
    pass

# Note here
__all__ += ['Foo']

如果您从foo import*中执行
,您将只看到
foo
(或者您添加到
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
)中的任何内容。

我会说它。为什么要在模块的命名空间中隐藏一些名称?如果这是通配符导入的问题,您是否考虑过使用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。我希望用户使用自动完成来查看他可以使用哪些对象。一种解决方案是在所有可用方法所在的模块内创建一个静态类。我不认为这是一个更好的解决方案为什么你认为任何人都会被它弄糊涂?不需要静态类,您可以公开应该使用的属性名称的列表(就像
\uuuu all\uuuuu
,甚至可能使用该名称!),但只要有任何导入,就会发生这种情况,很少会成为问题的症结所在。您不需要在末尾添加
'Foo'
,我认为把所有的名字都放在文件的顶部比较整洁。我同意它不必跟在类定义后面(毕竟,它只是一个字符串),但我通常不把它放在开头或结尾,而是与类/函数/任何东西组合在一起。这样,如果我修改了定义,我还记得修改all。它不起作用。如果您在iPython上导入此模块,自动完成操作仍将显示模块的所有成员,包括
ctypes
@nowox请参见更正-它会从导入的内容影响
*