删除模块以清理命名空间?
Delete modules to clean namespace?
我正在开发一个非常庞大的 Python 包。在几个模块内部,不同的程序员导入其他模块来进行计算。为了便于讨论,让我们坚持 numpy
。
通常的做法是,在导入模块时定义一个别名以便于编程,所以假设在模块 foo.py
中有一行代码在做
import numpy as np
所以会有一个foo.np
命名空间。我还发现,通过执行
删除 foo.py
中对 np
的引用
del np
在模块末尾似乎也清除了命名空间。
作为一个大包的维护者,我喜欢这种保持命名空间干净的方式,但我想知道这是否是一个好的编程习惯,或者是否会出现问题,特别是如果我的包有一个模块 bar.py
与 foo.py
相同的级别,它也使用相同的外部 numpy
模块?如果是,是否有一种简单且更好的方法来保持 foo
和 bar
的名称空间干净,或者这种名称空间管理本身是个坏主意吗?
这是一个简单的例子:
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
.
我正在开发一个非常庞大的 Python 包。在几个模块内部,不同的程序员导入其他模块来进行计算。为了便于讨论,让我们坚持 numpy
。
通常的做法是,在导入模块时定义一个别名以便于编程,所以假设在模块 foo.py
中有一行代码在做
import numpy as np
所以会有一个foo.np
命名空间。我还发现,通过执行
foo.py
中对 np
的引用
del np
在模块末尾似乎也清除了命名空间。
作为一个大包的维护者,我喜欢这种保持命名空间干净的方式,但我想知道这是否是一个好的编程习惯,或者是否会出现问题,特别是如果我的包有一个模块 bar.py
与 foo.py
相同的级别,它也使用相同的外部 numpy
模块?如果是,是否有一种简单且更好的方法来保持 foo
和 bar
的名称空间干净,或者这种名称空间管理本身是个坏主意吗?
这是一个简单的例子:
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
.