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

标签 python module namespaces package

我正在开发一个非常庞大的 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?

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

关于python - 删除模块以清理命名空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30040658/

相关文章:

python - 为什么 Stripe 每隔几个小时就会出现此错误 : Network error: ConnectionError:

node.js - 我可以在不使用 process.chdir() 的情况下更改 require( )'d module' s cwd )

python - 在类中调用模块函数

c++ - 命名空间中变量的默认/自定义值

python - pandas - 多个 'yes/no' 虚拟变量

python - 如何在 Ubuntu 上使用 Python 查找 Apache2 的配置错误?

python - Django 创建和更改 mysql 数据库以供学习之用

module - Terraform 模块变量.tf

java - SOAP - 没有命名空间的前缀

r - 在 R 中隐藏个人功能