我正在研究一个非常庞大的Python包。在几个模块中,不同的程序员会导入其他模块来进行计算。为了便于讨论,我们坚持numpy
。
常见的做法是,在导入模块时定义别名以简化编程,因此,假设模块中foo.py
有一行
import numpy as np
因此将有一个foo.np
命名空间。我还发现,通过删除提到np
里面foo.py
做
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
该文件中定义的对象不再可以访问。
命名空间的这种整理本身不是一个好主意吗?
我不确定您认为它有什么好处。从您已经完成使用的模块的命名空间中删除名称不会节省太多(如果有的话)空间,而底层的导入模块(numpy
在这种情况下)仍将位于中sys.modules
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句