Skip to main content

Randomly remove half the content of Python data structures, like a Thanos snap.

Project description

ThanosPy 🫰

PyPI version CI Status License: MIT Python Versions

"Perfectly balanced... as all things should be."

thanosPy provides a simple function, snap(), that takes a Python built-in data structure or type and randomly removes approximately half of its contents, returning the result as the same type.

Features

  • One Function: Simple snap(data) interface.
  • Type Preservation: Output type matches input type (e.g., list in -> list out, tuple in -> tuple out).
  • Random Removal: Uses random.sample for unbiased removal where applicable.
  • Supported Types:
    • list, tuple
    • set
    • dict (removes key-value pairs)
    • str (removes characters)
    • bytes, bytearray (removes bytes)
    • int (removes ~half the bits from binary representation)
    • float (removes ~half the bits from IEEE 754 representation - Warning: may produce NaN/Inf/unexpected values)
    • bool, None (returned unchanged)
  • Python 3.8+
  • Type Hinted

Installation

Install directly from PyPI:

'''bash pip install thanospy '''

Or install from the source repository:

'''bash pip install git+https://github.com/manyan-chan/thanosPy.git # Update USERNAME/REPO '''

For local development:

'''bash git clone https://github.com/manyan-chan/thanosPy.git # Update USERNAME/REPO cd thanosPy pip install -e .[test] '''

Usage Example

'''python import thanospy import random

For reproducibility in example

random.seed(42)

my_list = list(range(10)) print(f"Original List: {my_list}") snapped_list = thanospy.snap(my_list) print(f"Snapped List: {snapped_list} (Length: {len(snapped_list)})")

Example Output: Snapped List: [0, 1, 3, 4, 7] (Length: 5)

my_tuple = tuple(range(1, 11)) print(f"\nOriginal Tuple: {my_tuple}") snapped_tuple = thanospy.snap(my_tuple) print(f"Snapped Tuple: {snapped_tuple} (Length: {len(snapped_tuple)})")

Example Output: Snapped Tuple: (1, 2, 4, 5, 10) (Length: 5)

my_set = set(chr(ord('a') + i) for i in range(8)) print(f"\nOriginal Set: {my_set}") snapped_set = thanospy.snap(my_set) print(f"Snapped Set: {snapped_set} (Length: {len(snapped_set)})")

Example Output: Snapped Set: {'g', 'a', 'd', 'b'} (Length: 4)

my_dict = {i: i*i for i in range(7)} print(f"\nOriginal Dict: {my_dict}") snapped_dict = thanospy.snap(my_dict) print(f"Snapped Dict: {snapped_dict} (Length: {len(snapped_dict)})")

Example Output: Snapped Dict: {0: 0, 5: 25, 3: 9, 1: 1} (Length: 4)

my_string = "abcdefghijklmnopqrstuvwxyz" print(f"\nOriginal String: '{my_string}'") snapped_string = thanospy.snap(my_string) print(f"Snapped String: '{snapped_string}' (Length: {len(snapped_string)})")

Example Output: Snapped String: 'abcefhinopqsuwx' (Length: 13) # Corrected based on test seed

my_int = 1234567890 binary_int = bin(my_int) print(f"\nOriginal Int: {my_int} ({binary_int})") snapped_int = thanospy.snap(my_int) binary_snapped_int = bin(snapped_int) print(f"Snapped Int: {snapped_int} ({binary_snapped_int})")

Example Output: Snapped Int: 3345 (0b110100010001) # Corrected based on test seed

my_float = 123.456 print(f"\nOriginal Float: {my_float}") snapped_float = thanospy.snap(my_float) print(f"Snapped Float: {snapped_float}")

Example Output: Snapped Float: -1.918078863119037e-178 (Results vary wildly!)

print(f"\nOriginal Bool: {True}") print(f"Snapped Bool: {thanospy.snap(True)}")

Example Output: Snapped Bool: True

print(f"\nOriginal None: {None}") print(f"Snapped None: {thanospy.snap(None)}")

Example Output: Snapped None: None

Unsupported type

try: class Custom: pass thanospy.snap(Custom()) except TypeError as e: print(f"\nError for unsupported type: {e}")

Example Output: Error for unsupported type: Unsupported data type for snap: CustomObject

'''

How Snapping Works

  • Sequences/Sets/Dicts: Randomly selects ~50% of the items/keys to keep. The number kept is ceil(n / 2).
  • Integers: Converts the absolute value to its binary string representation (e.g., 10 -> '1010'). Randomly keeps ceil(num_bits / 2) bits. Converts the resulting binary string back to an integer. The original sign is reapplied.
  • Floats: Gets the IEEE 754 double-precision byte representation, converts to an integer, snaps the bits of that integer using the integer method, converts back to bytes, and then back to a float. Warning: This is a low-level manipulation and frequently results in very small numbers, NaN, Infinity, or -Infinity. Use with caution!
  • Bool/None: These types are returned unchanged as "snapping" doesn't apply meaningfully.

Testing

The package uses pytest. To run tests:

  1. Install test dependencies: pip install -e .[test]
  2. Run from the root directory:

'''bash pytest '''

Contributing

Contributions (bug reports, feature requests, PRs) are welcome! Please check the GitHub Repository.

License

This project is licensed under the MIT License - see the LICENSE file for details.

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

py_thanos_snap-0.1.0.tar.gz (8.5 kB view details)

Uploaded Source

Built Distribution

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

py_thanos_snap-0.1.0-py3-none-any.whl (7.1 kB view details)

Uploaded Python 3

File details

Details for the file py_thanos_snap-0.1.0.tar.gz.

File metadata

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

File hashes

Hashes for py_thanos_snap-0.1.0.tar.gz
Algorithm Hash digest
SHA256 1f47403c9c9dfa424c5745b4bd72810797cff32747328d4ba3f5751c9ab9848c
MD5 5a9edecf6a5f822609c505a9b3770103
BLAKE2b-256 6b6b65e5d05c1f69ee7a17a093d7a9d12381959231bbb3ae0753d7e8d216f0c7

See more details on using hashes here.

Provenance

The following attestation bundles were made for py_thanos_snap-0.1.0.tar.gz:

Publisher: python-package.yml on manyan-chan/thanosPy

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

File details

Details for the file py_thanos_snap-0.1.0-py3-none-any.whl.

File metadata

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

File hashes

Hashes for py_thanos_snap-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 b281c4497d3095e9f3c0aa858bddea35a95c13eb11a52c760fbc20aea63f0626
MD5 0dcf50771b76525e0ee08b2082fdc2e3
BLAKE2b-256 8dda2cd1fe167f4b5cea1c7b56a2b456bda7e0b0556e51030d0023cbd266b2d5

See more details on using hashes here.

Provenance

The following attestation bundles were made for py_thanos_snap-0.1.0-py3-none-any.whl:

Publisher: python-package.yml on manyan-chan/thanosPy

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