2012-12-26 37 views
2

我对包装pep8感兴趣,所以我可以在使用前将其修复。什么是包装模块的“正确”方式?包装python模块的优雅/正确的方式

如果我的模块被命名为pep8,并且在真正的pep8之前的某处存在于我的路径中,那么我的模块中的任何“import pep8”都只会导入它自己。我不知道真正的pep8会在哪里生存,因为这需要在多个系统中推广。我无法从sys.path中删除我的pep8包装程序所在的路径,因为根据执行系统的位置也会有所不同。

我不想重命名我的pep8,因为我希望pep8命令可以不加修改地工作。

我PEP8是包含__init__.py具有以下内容的目录:

from pep8 import * 
MAX_LINE_LENGTH = 119 
+0

有趣的问题回复:模块的monkeypatching,但PEP8是PEP8,因为它是一个标准,即使一些想法被设计用于可能只是偶尔出现的情况。 –

+0

是的。我们打算打破80列的法律。部分符合pep8要比根本不符合要好,如果我不能从E501输出产生混乱,那会让我的生活变得更轻松。 –

+1

为什么不在shell中将'pep8'替换为'python -m pep8 -max-line-length = 120'? –

回答

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 
+0

我在发布之前试过。如果我在导入后打印dir(pep8)'',我会得到:'['MAX_LINE_LENGTH','__builtins__','__doc__','__file__','__name__','__package__','__path__','absolute_import ']',这不是“真正的”pep8。 –

+0

另外,我的目标之一是使用操作系统分发的pep8命令,而不必修改它。如果我不得不做上述的相关导入,那是不行的。 –

1

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

我实际上使用它作为实例,我有一个模型是核心集的一部分,但可以通过其他应用程序(如前端应用程序)进行扩展。核心模型受到保护,但可以由其他开发人员扩展。

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