为什么导入的包在其他包中可见?

时间:2014-07-01 06:57:53

标签: python packages

如果我创建了一个名为foo的导入bar的软件包,那么当我导入bar时{0} foo下的foo.barfoo bar在另一个模块?有没有办法防止这种情况;保持{{1}}隐藏,以免混淆命名空间?

3 个答案:

答案 0 :(得分:3)

导入栏,无论您在何处使用它,而不是全局

如果在函数中使用bar,则导入为

def func():
  import bar
  ....

甚至,

if __name__ == '__main__':
    import bar
    my_main(bar)

或者如果你喜欢class es,

class Fubar():
    def __init__(self):
        import bar
        self.bar = bar

答案 1 :(得分:2)

Python中的导入实际上只是名称分配的另一种形式。导入到foo的对象与在foo中定义的对象之间确实没有区别 - 它们在内部和外部都以完全相同的方式可见。所以不,没有办法阻止这种情况。

但是,我并没有真正看到这是如何混淆命名空间的。您仍然只将一个名称foo导入到其他模块中。

答案 2 :(得分:0)

TL; DR:Python Imports为代码段创建命名绑定,以便引用和使用它们。

导入本质上是将一段代码绑定到名称。因此命名空间应始终反映已导入的内容。如果你隐瞒你可能最终导致其他人或你自己的意外问题。

如果您导入错误的模块,导入您不使用的模块,或者因为您在一个文件中有10个类而导致大量导入,则应考虑修复基础问题。不要试图通过搞乱模块的导入来隐藏它。