2015-11-04 47 views
2

有了这个简单的模块:如何从iPython中的命名空间隐藏导入的模块?

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

class Foo(ctypes.Structure): 
    pass 

在IPython中:

In [1]: import foo 
In [2]: foo. 
Foo 
ctypes 

​​是模块foo内部使用的模块,它不应该被显示给用户。我们的目标是通过ipython

隐藏​​以提供自动完成功能此解决方案是否太麻烦?

import ctypes as __ctypes 
+1

我会说这太麻烦了,是的(最多使用一个下划线)。 *为什么要隐藏模块名称空间中的一些名称?您是否考虑过使用'__all__'(请参阅http://stackoverflow.com/q/44834/3001761),如果这是通配符导入的问题? – jonrsharpe

+0

如果用户不知道“ctypes”是我的模块使用的模块,但不是它的一个功能,用户可能会感到困惑。我期待用户使用自动完成来查看他可以使用什么对象。一种解决方案是在所有可用方法所在的模块内创建一个静态类。我认为这不是一个更好的解决方案 – nowox

+0

为什么你认为任何人会被这个困惑?不需要静态类,你可以公开一个应该使用的属性名称列表(就像'__all__',甚至可以使用这个名称!),但是只要你有任何导入,并且很少被证明是一个棘手的问题。 – jonrsharpe

回答

3

我通常使用__all__。您的代码将成为类似:

import ctypes 

# Note here 
___all__ = [] 

class Foo(ctypes.Structure): 
    pass 

# Note here 
__all__ += ['Foo'] 

如果你这样做from foo import *,你会看到只有Foo(或者其他任何你添加到__all__)。

+0

你不需要在最后添加''Foo''',我会说把文件顶部的所有名称都包含进来是更加简单的。 – jonrsharpe

+0

我同意它不必在类定义之后去(毕竟它只是一个字符串),但我通常不会将它放在开头或结尾,而是将它与类/函数/其他分组在一起。这样,如果我修改了定义,我记得也修改了全部。 –

+0

它不起作用。如果您在iPython上导入此模块,则自动完成仍会显示模块的所有成员,包括'ctypes'。 – nowox