我正在开发一个 Python 包来处理一些科学数据。有来自其他模块和包(包括 numpy)的多个常用类和函数,我几乎在包的任何模块中定义的每个函数中都需要它们。
处理它们的 Pythonic 方式是什么?我考虑了多种变体,但每种变体都有自己的缺点。
使用
from foreignmodule import Class1, Class2, function1, function2 在模块级别导入类
然后可以从每个函数轻松访问导入的函数和类。另一方面,它们污染了模块命名空间,使得dir(package.module)
和help(package.module)
被导入的函数弄得乱七八糟使用
from foreignmodule import Class1, Class2, function1, function2 导入函数级别的类
函数和类很容易访问并且不会污染模块,但是从每个函数中多达十几个模块的导入看起来像是很多重复的代码。使用
import foreignmodule
在模块级别导入模块 需要在每个函数或类调用前添加模块名称来弥补过多的污染。使用一些人为的变通方法,例如对所有这些操作使用函数体并仅返回要导出的对象...像这样
def _export(): from foreignmodule import Class1, Class2, function1, function2 def myfunc(x): return function1(x, function2(x)) return myfunc myfunc = _export() del _export
这设法解决了两个问题,模块命名空间污染和函数的易用性......但它似乎根本不是 Pythonic。
那么什么解决方案是最 Pythonic 的呢?还有其他我忽略的好解决方案吗?
最佳答案
继续做你通常的 from W import X, Y, Z
然后使用 __all__
特殊符号来定义你打算让人们从你的模块:
__all__ = ('MyClass1', 'MyClass2', 'myvar1', …)
这定义了如果他们从您的模块中import *
将被导入到用户模块中的符号。
一般来说,Python 程序员应该不使用 dir()
来弄清楚如何使用您的模块,如果他们这样做,则可能表明某处存在问题别的。他们应该阅读您的文档或输入 help(yourmodule)
以了解如何使用您的库。或者他们可以自己浏览源代码,在这种情况下(a)您导入的东西和您定义的东西之间的区别非常清楚,并且(b)他们会看到 __all__
声明并知道哪些玩具他们应该一起玩。
如果您尝试在这种情况下支持 dir()
来执行并非为它设计的任务,您将不得不对自己的代码设置烦人的限制,我希望很清楚从这里的其他答案。我的建议:不要这样做!查看标准库以获取指导:它在代码清晰和简洁需要时执行 from ... import ...
,并提供 (1) 信息丰富的文档字符串、(2) 完整文档和 (3) 可读代码,因此没有人必须在模块上运行 dir()
并尝试将导入与模块中实际定义的内容区分开来。
关于python - 我应该如何在 python 模块中执行导入而不污染其命名空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7423744/