Captain Midday
Captain Midday

Reputation: 669

Elegant/proper way to wrap a python module

I'm interested in wrapping pep8 so I can monkey-patch it before use. What is the "right" way to wrap a module?

If my module is named pep8 and lives in my path somewhere before the real pep8, any "import pep8" in my module will just import itself. I don't know in advance where the real pep8 will live, since this needs to be generalized for multiple systems. I can't remove the path where my pep8 wrapper lives from sys.path, because that too will be different depending on the system where it's executed.

I don't want to have to rename my pep8, because I'd like for the pep8 command to work without modification.

My pep8 is a directory containing a __init__.py with the following contents:

from pep8 import *
MAX_LINE_LENGTH = 119 

Upvotes: 3

Views: 9543

Answers (2)

SkyLeach
SkyLeach

Reputation: 1482

I realize this is an old question, but it still comes up in google searches. For instances where this is actually desired (ex: protected library wrapping) I suggest the WRAPT package.

I actually use this for instances where I have a model that is part of a core set but can be extended by other applications (such as front-ends like flask apps). The core model is protected but can be extended by other developers.

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

Upvotes: 1

Tim Swena
Tim Swena

Reputation: 14786

For Python 2.5+, you can specify using absolute imports by default. With from __future__ import absolute_import.

For monkey patching a Python module, you'll want to do relative imports from your project to your overridden module.

For this example, I will assume you are distributing a library. It requires a little finessing for other projects, since the __main__ python file cannot have relative imports.

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 

Upvotes: 1

Related Questions