Do not allow prints in your code
Project description
Cyclic Classes
About
Ever had a situation when you wanted to create a cyclic reference between two objects, but don't want to maintain a large singular file? You're tired of seeing "cyclic-import" errors? This package is for you! Simply "register" a class you want to share between different modules and you're pretty much good to go!
See the documentation for more information.
Requirements
There's NONE!
Installation
Pull straight from this repo to install manually or just use pip: pip install cyclic-classes
will do the trick.
Usage
Consider a package myk8s
with two modules, maybe one is to reference a k8s deployment and the other one is for pods within that deployment.
deployment.py
from .pod import Pod
class Deployment:
def __init__(self, name: str):
self.name = name
@property
def pods(self):
return [Pod(f"{self.name}-pod-{i}") for i in range(3)]
Now, if you want to create a back-reference for Deployment within Pod, like this:
pod.py
from .deployment import Deployment
class Pod:
def __init__(self, name: str):
self.name = name
@property
def deployment(self):
return Deployment(self.name.split("-")[0])
In the above example, you would get a cyclic-import error. To avoid this, you can use cyclic_classes
to register the classes you want to share between modules.
Do so like this:
deployment.py
from cyclic_classes import register, cyclic_import
with cyclic_import(): # This is required to avoid cyclic-import errors - you're actually importing a registered class underneath, but IDE will think it's your actual class
from .pod import Pod
@register # You have to register the class you want to access so that Pod will also be able to use it in the pod.py file
class Deployment:
def __init__(self, name: str):
self.name = name
@property
def pods(self):
return [Pod(f"{self.name}-pod-{i}") for i in range(3)]
Now, if you want to create a back-reference for Deployment within Pod, like this:
pod.py
from cyclic_classes import register, cyclic_import
with cyclic_import():
from .deployment import Deployment
@register # Making Pod available to cyclic_import
class Pod:
def __init__(self, name: str):
self.name = name
@property
def deployment(self):
return Deployment(self.name.split("-")[0])
And that's it! You can now use the classes in your code without any issues.
Note
Cyclic import supports multiple ways of imports, including relative imports, absolute imports, and even module imports.
As such, in the cyclic_import
context you can use either of the following:
import myk8s.deployment as depl # And later use depl.Deployment
from .deployment import Deployment
from myk8s.deployment import Deployment
# Not recommended, but also possible
# Reason: Such imports wouldn't work even if there was no cyclic import issue, but it works with cyclic import (you'll get a warning though) and some IDEs think it's correct
from deployment import Deployment
import deployment
This also works with aliases! So feel free to use import ... as ...
or from ... import ... as ...
as you wish.
Development
Installation
Install virtual environment and cyclic_classes package in editable mode with dev dependencies.
python -m venv venv
source venv/bin/activate
pip install -e .[dev]
Formatting
Use black and isort (with black profile) to format the code.
isort .
black .
Syntax checks
Use pylint to check the code for errors and potential problems. Also use noprint to detect print statements in the code (use logging instead!).
isort -c .
black --check .
pylint cyclic_classes tests tests/packages/**/cc_one tests/packages/**/cc_two
noprint -ve cyclic_classes tests
Testing
For testing use coverage with pytest workers - this is due to errors that pytest-cov sometimes has with Python 3.9 and above.
coverage run -m pytest -xv tests
coverage report -m --fail-under=30
coverage erase
Clean up
Clean up the project directory from temporary files and directories. Purge virual environment.
coverage erase
rm -rf cyclic_classes.egg-info/ dist/ build/
rm -rf venv/
Project details
Release history Release notifications | RSS feed
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
Hashes for cyclic_classes-0.0.1-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | fef886408fb3061c909e6e7674ead90769f13810396280618244ef36510718f4 |
|
MD5 | d136d785bd5688a8861c68b400b6136d |
|
BLAKE2b-256 | bfd97b67e3420171f5a6d2ba5e43c981d9ae5c58b616f96b87c6faf85b6c28cf |