Skip to main content

Swizzle enables the retrieval of multiple attributes, similar to swizzling in computer graphics.

Project description

Swizzle

PyPI Latest Release Pepy Total Downloads GitHub License

Introduction

Swizzle is a Python package that enhances attribute access, allowing for flexible retrieval of multiple attributes based on specified arrangements of their names.

Managing object attributes efficiently can sometimes become cumbersome, especially when you need to access multiple attributes in various combinations. Swizzle simplifies this process by extending Python's attribute access mechanisms, enabling you to access attributes in any order or combination without explicitly referencing the instance every time.

Features

  • Dynamic Attribute Access: Retrieve multiple attributes in any specified arrangement.
  • Integration with Existing Classes: Works seamlessly with regular classes, dataclass, and even Enum types.
  • Swizzled Setters (New!): Optionally enable attribute assignment with swizzling syntax (e.g., vec.xyz = 1,2,3).

Installation

From PyPI

Install Swizzle via pip:

pip install swizzle

From GitHub

Install the latest version directly from GitHub:

pip install git+https://github.com/janthmueller/swizzle.git

Getting Started

Basic Usage with the @swizzle Decorator

Apply the @swizzle decorator to your class:

import swizzle

@swizzle
class Vector:
    def __init__(self, x, y, z):
        self.x = x
        self.y = y
        self.z = z

v = Vector(1, 2, 3)

# Access attributes in different orders
print(v.yzx)  # Output: Vector(y=2, z=3, x=1)

Using Swizzle with dataclass

Swizzle integrates smoothly with Python's dataclass:

import swizzle
from dataclasses import dataclass

@swizzle
@dataclass
class Point:
    x: int
    y: int
    z: int

p = Point(1, 2, 3)

print(p.zxy)  # Output: Point(z=3, x=1, y=2)

Swizzling Enums with meta=True

Enable attribute swizzling directly on the class by setting meta=True:

import swizzle
from enum import IntEnum

@swizzle(meta=True)
class Axis(IntEnum):
    X = 1
    Y = 2
    Z = 3

print(Axis.YXZ)  # Output: Axis(Y=<Axis.Y: 2>, X=<Axis.X: 1>, Z=<Axis.Z: 3>)

Swizzled Setters (New!)

Starting with the latest version, Swizzle supports setting multiple attributes at once using swizzled assignment syntax:

import swizzle

@swizzle(setter=True)
class Vector:
    def __init__(self, x, y, z):
        self.x = x
        self.y = y
        self.z = z

v = Vector(1, 2, 3)

# Set multiple attributes in swizzled order
v.zyx = 9, 8, 7

# Access the attributes with swizzle syntax
print(v.zyx)  # Output: Vector(z=9, y=8, x=7)

Advanced Usage

Swizzled Named Tuples with swizzledtuple

Create swizzled named tuples inspired by namedtuple:

from swizzle import swizzledtuple

Vector = swizzledtuple('Vector', 'x y z') # Equivalent to swizzle.t('Vector', 'x y z')

v = Vector(1, 2, 3)

print(v.yzx)        # Output: Vector(y=2, z=3, x=1)
print(v.yzx.xxzyzz) # Output: Vector(x=1, x=1, z=3, y=2, z=3, z=3)

Custom Separators for Clearer Access

You can customize the separator used between attribute names in swizzle expressions to make them more readable—especially when combining many fields. Use the sep argument in the @swizzle decorator:

import swizzle

@swizzle(sep='_')
class Vector:
    def __init__(self, x, y, z, w):
        self.x = x
        self.y = y
        self.z = z
        self.w = w

v = Vector(1, 2, 3, 4)

print(v.x_y_z_w)  # Output: Vector(x=1, y=2, z=3, w=4)

This helps visually separate attribute names, making swizzled expressions more readable and less error-prone in complex cases.

License

This project is licensed under the terms of the MIT license. See the LICENSE file for details.

Contributions

Contributions are welcome! Feel free to submit a Pull Request or open an Issue on GitHub.

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

swizzle-2.6.1.tar.gz (13.4 kB view details)

Uploaded Source

Built Distribution

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

swizzle-2.6.1-py3-none-any.whl (11.7 kB view details)

Uploaded Python 3

File details

Details for the file swizzle-2.6.1.tar.gz.

File metadata

  • Download URL: swizzle-2.6.1.tar.gz
  • Upload date:
  • Size: 13.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.8

File hashes

Hashes for swizzle-2.6.1.tar.gz
Algorithm Hash digest
SHA256 11b9c5795076c7acaf260bc742e0b25dd095da079745e07b6b4e0a02f828fb2e
MD5 7b745c4b3f832efdff8fab3c7328e4c6
BLAKE2b-256 7bce33e5714220219c9fcfbecf465f50f940c0a8bbbeed6ff8b69a5e63905ffe

See more details on using hashes here.

File details

Details for the file swizzle-2.6.1-py3-none-any.whl.

File metadata

  • Download URL: swizzle-2.6.1-py3-none-any.whl
  • Upload date:
  • Size: 11.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.8

File hashes

Hashes for swizzle-2.6.1-py3-none-any.whl
Algorithm Hash digest
SHA256 d7dd52a22facabfd01355fc6e4abe5af9683aec126908af01f7d042591190fb6
MD5 792b8dac20d6f57cf68cb2955bb18db0
BLAKE2b-256 7bdcadd7d5c3bbfdb26b29138be90fa48d1b2a1a087e9dce0e6364285c4a4ef9

See more details on using hashes here.

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