Recursive Monkey Patching
Project description
Recursive monkey patching for Python
====================================
Motivating use case
-------------------
Let ``foo`` be a Python package, built on top of another Python
package ``bar``. Sometimes ``foo`` may wish to extend the ``bar``
package by adding features (e.g. methods) to existing classes or
modules. Sometimes the whole package is meant as a temporary location
where experimental features can mature and be distributed early until
they get merged into the ``bar`` package.
In such cases, it's desirable to write the source code of those
features as closely as if they were in the ``bar`` package.
``recursive-monkey-patch`` enables this by providing a tool to
recursively monkey patch the ``bar`` package. Let's assume for example
that we are writing a package ``bar-foo`` that requires the addition
of a method ``f`` to the class ``bar.x.y.z.Z``.
To achieve this, one writes a module ``sage_foo.x.y.z.Z`` containing a
dummy ``Z`` class:
class Z:
def f(self):
return "f"
And then, upon initializing the package, one runs:
import bar
import foo
from recursive_monkey_patch import monkey_patch
monkey_patch(foo, bar)
which will recursively crawl through ``foo``, and insert methods like
``f`` at the corresponding location in ``bar``. If a class or module
in ``foo`` does not exist in ``bar``, then the module is inserted at
the corresponding location in ``bar``
Relation with SageMath
----------------------
This package is primarily meant for writing (experimental) packages on
top of `SageMath <http://sagemath.org>`_, an open source software for
mathematics that includes a large Python library. However, the
dependency upon the ``SageMath`` package is actually light:
- Running the doctests requires ``sage``;
- When the SageMath package is present, the monkey patching involves a
few additional Sage specific hacks.
ToDo
----
- Support for lazy imports
- Where is the natural place for running ``monkey_patch` in a package?
====================================
Motivating use case
-------------------
Let ``foo`` be a Python package, built on top of another Python
package ``bar``. Sometimes ``foo`` may wish to extend the ``bar``
package by adding features (e.g. methods) to existing classes or
modules. Sometimes the whole package is meant as a temporary location
where experimental features can mature and be distributed early until
they get merged into the ``bar`` package.
In such cases, it's desirable to write the source code of those
features as closely as if they were in the ``bar`` package.
``recursive-monkey-patch`` enables this by providing a tool to
recursively monkey patch the ``bar`` package. Let's assume for example
that we are writing a package ``bar-foo`` that requires the addition
of a method ``f`` to the class ``bar.x.y.z.Z``.
To achieve this, one writes a module ``sage_foo.x.y.z.Z`` containing a
dummy ``Z`` class:
class Z:
def f(self):
return "f"
And then, upon initializing the package, one runs:
import bar
import foo
from recursive_monkey_patch import monkey_patch
monkey_patch(foo, bar)
which will recursively crawl through ``foo``, and insert methods like
``f`` at the corresponding location in ``bar``. If a class or module
in ``foo`` does not exist in ``bar``, then the module is inserted at
the corresponding location in ``bar``
Relation with SageMath
----------------------
This package is primarily meant for writing (experimental) packages on
top of `SageMath <http://sagemath.org>`_, an open source software for
mathematics that includes a large Python library. However, the
dependency upon the ``SageMath`` package is actually light:
- Running the doctests requires ``sage``;
- When the SageMath package is present, the monkey patching involves a
few additional Sage specific hacks.
ToDo
----
- Support for lazy imports
- Where is the natural place for running ``monkey_patch` in a package?
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Close
Hashes for recursive-monkey-patch-0.2.0.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | b2b73ff28ce22f2de496c22eb42b545f43102e63afd0e38b12c2edcd2ef7f170 |
|
MD5 | af74b90515407ab61784095d5b211f0e |
|
BLAKE2b-256 | 7f7b69524f2ddd6844c6294549b5c2986ed96b243861efb09144eb757e1cae46 |
Close
Hashes for recursive_monkey_patch-0.2.0-py2.py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 1188d210e44f25d87e1ff22fb09b5f4ee5b209c9cc03b5e051901e37d8ab29fc |
|
MD5 | 234c75f53aed0a0ae7cc7f6fd6907e5a |
|
BLAKE2b-256 | 9ceb6e3c41d1bb15228c519bb3a86a76c75f8392df5cd556b4016a4513ea17f2 |