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:

pip install py-thanos-snap

Or install from the source repository:

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

For local development:

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

Usage Example

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:
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.4.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.4-py3-none-any.whl (7.1 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: py_thanos_snap-0.1.4.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.4.tar.gz
Algorithm Hash digest
SHA256 c0d78e93da2f9dfab876b3316f29974b5f96ba99a3d6103ee9e65aeb7e593833
MD5 1948151b3c6ae26ad7a3b0cc5dcc85ec
BLAKE2b-256 e3313b382a72ca7b163d3bbb70a80c427511efebbff61d3ab940d53b18107fa7

See more details on using hashes here.

Provenance

The following attestation bundles were made for py_thanos_snap-0.1.4.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.4-py3-none-any.whl.

File metadata

  • Download URL: py_thanos_snap-0.1.4-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.4-py3-none-any.whl
Algorithm Hash digest
SHA256 6a2b828160f5aa933e5f8e6757e1da3866e8121e39739b3795bfd5b158baeec0
MD5 b839577d1460411b1844a328bd6508f2
BLAKE2b-256 a56dace107df77dab002e5e419278c86ee3374aa9442dec8726355ced4b7cc88

See more details on using hashes here.

Provenance

The following attestation bundles were made for py_thanos_snap-0.1.4-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