Generic implementation of the Composite Design Pattern as a Python class decorator.
Project description
Composite Class Decorator
This project contains a generic implementation of the Composite Design Pattern as a Python class decorator.
This is a targeted solution addressing the particular need of creating composite Builders. All existing solutions we observed so far assumed manual reproduction on every abstract method in Composite, which is problematic from a maintenance point of view.
For more technical in-depth discussion please refer to our article: Generic Composite in Python
Usage Example
from abc import ABC, abstractmethod
from typing import Tuple, Any
from pycomposite import composite
class Configuration:
'''
Just an example to demostrate side-effect
'''
def __init__(self):
self._configuration = {}
def configure(self, name: str, value: Any) -> None:
self._configuration[name] = value
class Builder(ABC):
@abstractmethod
def build_part_one(self, arg: int) -> Tuple: #better coveres a general case
pass
@abstractmethod
def build_part_two(self, arg: str) -> Tuple:
pass
@abstractmethod
def configure_part_three(self, arg: Configuration) -> None:
pass
class BuilderA(Builder):
def build_part_one(self, arg: int) -> Tuple: #better coveres a general case
return arg*10, arg+5,
def build_part_two(self, arg: str) -> Tuple:
return f'A: {arg}',
def configure_part_three(self, arg: Configuration) -> None:
arg.configure('A', 'A builder')
class BuilderB(Builder):
def build_part_one(self, arg: int) -> Tuple: #better coveres a general case
return arg-100, arg*5,
def build_part_two(self, arg: str) -> Tuple:
return f'B: {arg}',
def configure_part_three(self, arg: Configuration) -> None:
arg.configure('B', 'B builder')
@composite
class CompositeBuilder(Builder):
pass
builder = CompositeBuilder(BuilderA(), BuilderB())
config = Configuration()
builder.configure_part_three(config)
assert (70, 12, -93, 35) == builder.build_part_one(7)
assert ('A: high', 'B: high') == builder.build_part_two('high')
assert {'A': 'A builder', 'B': 'B builder'} == config._configuration
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
File details
Details for the file pycomposite-1.0.2.tar.gz
.
File metadata
- Download URL: pycomposite-1.0.2.tar.gz
- Upload date:
- Size: 9.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: python-requests/2.28.1
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 5b97bed93a5ad223618e4d8da954dec1773a854ddf0114a84e55f978ad78dd69 |
|
MD5 | 382cfd99819d87c4bfd5a2b567f08bf9 |
|
BLAKE2b-256 | 609abbb13d6a68b204e5da109e412bc2c470bd3df5f3f05b743563b636869d00 |
File details
Details for the file pycomposite-1.0.2-py3-none-any.whl
.
File metadata
- Download URL: pycomposite-1.0.2-py3-none-any.whl
- Upload date:
- Size: 4.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: python-requests/2.28.1
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0de04399ff908234725ea7c1a7393a553bd0165c48054c5f505678603bdfc044 |
|
MD5 | 13361372e0b1624e8e3176984571bdd4 |
|
BLAKE2b-256 | 76c6d684b6345963066aaaccec025581f56f4b469cb8c701bb101aaa278d796c |