gpt4 book ai didi

python - 维护一个整洁的命名空间

转载 作者:太空宇宙 更新时间:2023-11-03 11:08:15 24 4
gpt4 key购买 nike

tl;dr:我如何在一些 __init__.py 中创建一个新的命名空间,并将另一个命名空间的选择位复制到其中,而不需要新目录中的子模块?

完整问题:

假设我在一个包中有一对模块,目录结构如下:

foo/mod_1.py
foo/mod_2.py
foo/__init__.py

mod_1.py如下:

import numpy

__all__ = ['test1']

def test1():
return numpy.zeros(10)

mod_2.py如下:

import numpy

def test2():
return numpy.zeros(20)

__init__.py如下:

from mod_1 import *
import mod_2

del mod_1

这或多或少会产生所需的命名空间:

In [7]: dir(foo)
Out[7]:
['__builtins__',
'__doc__',
'__file__',
'__name__',
'__package__',
'__path__',
'mod_2',
'test1']

除了 numpy 现在位于 foo.mod_2 命名空间中。如果我尝试在 __init__.py 中删除它,使用 del mod_2.numpy,它不再存在于该模块,所以 mod_2.test2坏了。

我可以通过创建一个包含 mod_2.py 的额外目录 mod_2 来实现我想要的,但我希望尽可能保持目录结构不变。

因此我最初的问题。

编辑:我不介意做一些名字修改来阻止一个名字踩到另一个名字上。假设将 mod_2.py 的相关位放入 foo._mod_2

最佳答案

不想这样做,因为您发现自己破坏了代码。

Python 是一种动态语言,内省(introspection)让我们可以不受限制地访问解释器可以访问的几乎所有内容。这也适用于您的模块。

如果它让你感觉好些,同样的事情也适用于标准库:

>>> import unittest
>>> unittest.sys
<module 'sys' (built-in)>
>>> unittest.types
<module 'types' from '/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/types.pyc'>
>>> dir(unittest)
['FunctionTestCase', 'TestCase', 'TestLoader', 'TestProgram', 'TestResult', 'TestSuite', 'TextTestRunner', '_CmpToKey', '_TextTestResult', '_WritelnDecorator', '__all__', '__author__', '__builtins__', '__doc__', '__email__', '__file__', '__metaclass__', '__name__', '__package__', '__unittest', '__version__', '_makeLoader', '_strclass', 'defaultTestLoader', 'findTestCases', 'getTestCaseNames', 'main', 'makeSuite', 'os', 'sys', 'time', 'traceback', 'types']

一切模块在其全局命名空间中所需的一切都可以从外部看到。 这是正常的

正如您已经发现的那样,使用 __all__ 来控制 from modulename import * 通配符导入,否则不要管您的模块命名空间。

当然,如果您想为您的包的用户提供一个干净的 API,没有什么可以阻止您将 API 中的名称导入顶级包 __init__.py ,或使用 api.py 模块。

导入只是指在当前模块中添加一个与变量同名的变量; mod_2.numpysys.modules['numpy'] 完全相同,或者在您运行 后当前模块中的 numpy >导入 numpy

关于python - 维护一个整洁的命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13627041/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com