Skip to main content

Implementation of generic python builder

Project description

Python Builder

Simple implementation of a builder pattern for Python. This library is done to be as small and simple as possible. I wanted an easy wrapper around any class.

In my tests, I explicitly check if my library works with:

  • base python class
  • python dataclass
  • python "slotted" class (using __slots__)
  • pydantic BaseModel

But because of how simple the code is, I expect it to work with all classes.

Usage

To use the Python Builder, decorate your classes with @add_builder and utilize the generated builder() method to construct instances fluently.

Example with a Regular Python Class

from python_builder import add_builder

@add_builder
class RegularClass:
    def __init__(self, a: int, b: str, c: bool):
        self.a = a
        self.b = b
        self.c = c

# Building an instance
builder = RegularClass.builder()
instance = (
    builder
    .set("a", 10)
    .set("b", "test")
    .set("c", True)
    .build()
)

print(instance.a)  # Output: 10
print(instance.b)  # Output: test
print(instance.c)  # Output: True

Example with a Dataclass

from dataclasses import dataclass
from python_builder import add_builder

@add_builder
@dataclass
class DataClass:
    x: float = None
    y: str = None
    z: int = None

# Building an instance
instance = (
    DataClass.builder()
    .set("x", 3.14)
    .set("y", "pi")
    .set("z", 42)
    .build()
)

print(instance.x)  # Output: 3.14
print(instance.y)  # Output: pi
print(instance.z)  # Output: 42

Example with a Pydantic Model

from pydantic import BaseModel
from python_builder import add_builder

@add_builder
class PydanticModel(BaseModel):
    foo: str
    bar: int
    baz: bool

# Building an instance
instance = (
    PydanticModel.builder()
    .set("foo", "hello")
    .set("bar", 123)
    .set("baz", False)
    .build()
)

print(instance.foo)  # Output: hello
print(instance.bar)  # Output: 123
print(instance.baz)  # Output: False

Example with a Slotted Class

from python_builder import add_builder

@add_builder
class SlotClass:
    __slots__ = ["x", "y", "z"]

    def __init__(self, x: int, y: str, z: bool):
        self.x = x
        self.y = y
        self.z = z

# Building an instance
instance = (
    SlotClass.builder()
    .set("x", 100)
    .set("y", "slot test")
    .set("z", True)
    .build()
)

print(instance.x)  # Output: 100
print(instance.y)  # Output: slot test
print(instance.z)  # Output: True

Merging Builders

You can merge multiple builder instances using the | operator. The resulting builder inherits properties from both builders. In cases of conflicting properties, the values from the builder on the right take precedence.

builder1 = RegularClass.builder().set("a", 1).set("b", "initial")
builder2 = RegularClass.builder().set("b", "overridden").set("c", True)
merged_builder = builder1 | builder2  # Merges builder1 and builder2; 'b' from builder2 takes precedence
instance = merged_builder.build()

print(instance.a)  # Output: 1       # Inherited from builder1
print(instance.b)  # Output: overridden  # Overridden by builder2
print(instance.c)  # Output: True    # Inherited from builder2

When merging builders using the | operator, the resulting builder combines the properties from both builders. If both builders set the same property, the value from the builder on the right side of the | operator overrides the one from the left.

Handling Errors

If you set an invalid property or omit required properties, the builder will raise appropriate errors.

# Setting an invalid property
builder = RegularClass.builder().set("d", "invalid")
instance = builder.build()  # Raises TypeError

# Building with missing required properties
builder = RegularClass.builder().set("a", 100)
instance = builder.build()  # Raises TypeError

These examples demonstrate how to utilize the Python Builder with different types of classes, handle merging of builders, and manage potential errors during the building process.

Developement

I use uv so I expect you have it installed too. After cloning the repo, run:

uv sync

That should install all dev dependencies. After that, activate venv and run:

pre-commit install

That will auto format your code on each commit.

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

python_builder-0.4.1.tar.gz (5.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

python_builder-0.4.1-py3-none-any.whl (4.6 kB view details)

Uploaded Python 3

File details

Details for the file python_builder-0.4.1.tar.gz.

File metadata

  • Download URL: python_builder-0.4.1.tar.gz
  • Upload date:
  • Size: 5.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for python_builder-0.4.1.tar.gz
Algorithm Hash digest
SHA256 43b2fa54c380f2a845c95ef7a5bafe2bab7e60ce6ae212a069fdc86347222fa1
MD5 c6c6babffe90905f21e4c68765dcf590
BLAKE2b-256 ab581725f9e50aeb213966eb52446356181e81e9b6dd3e3a674938d367baf333

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_builder-0.4.1.tar.gz:

Publisher: python-publish.yml on ChrisW-priv/python-builder

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file python_builder-0.4.1-py3-none-any.whl.

File metadata

  • Download URL: python_builder-0.4.1-py3-none-any.whl
  • Upload date:
  • Size: 4.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for python_builder-0.4.1-py3-none-any.whl
Algorithm Hash digest
SHA256 d28ea9b97b561c467536ecaaf9e6e909f276b89ac0d3b6d40a08db3b434bd772
MD5 709c8f2c04afc134f4bf29eae8868556
BLAKE2b-256 3e2e352933231923337e4d6526df2a055e6d06445c4a25a5b9c196520500c62e

See more details on using hashes here.

Provenance

The following attestation bundles were made for python_builder-0.4.1-py3-none-any.whl:

Publisher: python-publish.yml on ChrisW-priv/python-builder

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page