优雅/正确的方式来包装python模块

时间:2012-12-26 20:25:11

标签: python wrapper

我对包装pep8很感兴趣,所以我可以在使用前进行猴子修补。包装模块的“正确”方法是什么?

如果我的模块名为pep8并且在真正的pep8之前的某个地方生活在我的路径中,我的模块中的任何“import pep8”都将自行导入。我事先并不知道真正的pep8会在哪里生存,因为这需要针对多个系统进行推广。我无法从sys.path中删除pep8包装器所在的路径,因为根据执行它的系统,它也会有所不同。

我不想重命名我的pep8,因为我希望pep8命令无需修改即可工作。

我的pep8是一个包含__init__.py的目录,其中包含以下内容:

from pep8 import *
MAX_LINE_LENGTH = 119 

2 个答案:

答案 0 :(得分:1)

对于Python 2.5+,您可以默认使用绝对导入指定。使用from __future__ import absolute_import

对于猴子修补Python模块,你需要从你的项目到被覆盖的模块进行相对导入。

对于这个例子,我假设您正在分发一个库。由于__main__ python文件不能进行相对导入,因此需要对其他项目进行一些修改。

myproject/__init__.py

from . import pep8 # optional "as pep8"
# The rest of your code, using this pep8 module.

myproject/pep8/__init__.py

from __future__ import absolute_import
from pep8 import *
MAX_LINE_LENGTH = 119 

答案 1 :(得分:1)

我意识到这是一个老问题,但它仍然出现在谷歌搜索中。对于实际需要的实例(例如:受保护的库包装),我建议使用WRAPT包。

我实际上将此用于我的模型是核心集的一部分但可以由其他应用程序扩展的实例(例如烧瓶应用程序等前端)。核心模型受到保护,但可以由其他开发人员扩展。

https://pypi.python.org/pypi/wrapt