删除模块以清理命名空间?

Delete modules to clean namespace?

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

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

import numpy as np

所以会有一个foo.np命名空间。我还发现,通过执行

删除 foo.py 中对 np 的引用
del np

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

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

这是一个简单的例子:

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 不再可供该文件中定义的对象访问。


is this housekeeping of namespaces itself a bad idea?

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