【问题标题】:Delete modules to clean namespace?删除模块以清理命名空间?
【发布时间】:2015-05-05 06:14:22
【问题描述】:

我正在开发一个非常庞大的 Python 包。在几个模块中,不同的程序员导入其他模块进行计算。为了这个讨论,让我们坚持numpy

通常的做法是,在导入模块时定义一个别名以便于编程,所以假设在模块foo.py 中有一行在做

import numpy as np

所以会有一个foo.np 命名空间。我还发现,通过删除对foo.py 中的np 的引用,这样做

del np

在模块的末尾似乎也清除了命名空间。

作为一个大型包的维护者,我喜欢这种保持命名空间干净的方式,但我想知道这是否是一种好的编程习惯,或者是否会出现问题,特别是如果我的包有一个模块 bar.pyfoo.py 也使用相同的外部numpy 模块?如果是,是否有一种简单且更好的方法来保持 foobar 的命名空间干净,或者这种命名空间管理本身是一个坏主意?

【问题讨论】:

    标签: python module namespaces package


    【解决方案1】:

    这是一个简单的例子:

    foo.py:

    import numpy as np
    
    def foo(x):
        """Return 2D square array of zeros."""
        return np.zeros((x, x))
    
    del np
    

    bar.py:

    import numpy as np
    
    def bar():
        """Return 3x3 square array."""
        return np.arange(9).reshape(3, 3)
    

    main.py:

    from bar import bar
    from foo import foo
    
    print bar()
    
    print foo(3)
    

    以下是输出:

    [[0 1 2]
     [3 4 5]
     [6 7 8]]
    
    Traceback (most recent call last):
      File "/Users/jonrsharpe/Documents/main.py", line 6, in <module>
        print foo(3)
      File "/Users/jonrsharpe/Documents/foo.py", line 5, in foo
        return np.zeros((x, x))
    NameError: global name 'np' is not defined
    

    很明显,这影响了bar.py(您应该期望 - del 删除 该引用,但不影响底层对象)但有破坏了从foo.py 导入的功能,因为该文件中定义的对象不再可以访问np


    这种命名空间管理本身是个坏主意吗?

    我不确定你认为它的好处是什么。从您已完成使用的模块的命名空间中删除名称不会节省太多(如果有的话)空间,并且底层导入的模块(在这种情况下为numpy)仍将在sys.modules 中。

    【讨论】:

    • 我小组中的大多数人都使用具有自动完成功能的编辑器,命名空间中的每个名称都会显示出来。所以这基本上只是一个方便的问题。除此之外,在某些情况下,保持进口本身清洁是防止循环进口问题的好方法。所以我开始考虑清理每个模块内的命名空间是否是个好主意。在你回答之后,显然不是。
    • @Dschoni 您可能会发现这并没有什么区别——例如,我刚刚在 PyCharm 中尝试过,imported 名称仍然在 del 之后的行上自动完成(和行在import 之前,就此而言!)
    • 这意味着,除了从命名空间中清除名称的可能性之外,它甚至没有做,我期望它......谢谢。离开 Spyder 的另一个原因。
    • @Dschoni 我不知道它是否可以在 any IDE 中工作;它必须为给定文件的不同部分中的自动完成保存不同的命名空间。
    • 清理命名空间是一个非常重要的目的,因为它使包对用户来说也很直观。一般来说,python 社区在非常基本的用户界面方面有很多需要学习的地方。
    猜你喜欢
    • 1970-01-01
    • 2011-06-14
    • 1970-01-01
    • 2010-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-13
    相关资源
    最近更新 更多