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 thanospy

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

Uploaded Python 3

File details

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

File metadata

  • Download URL: py_thanos_snap-0.1.2.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.2.tar.gz
Algorithm Hash digest
SHA256 fad0a4b050533196efc2a81a67a11f940dcef4c093fe43f7d4eec44da72d5f7b
MD5 5d44dc92b1b6e4727adaa233a8a4135e
BLAKE2b-256 72e7bbed8ad4900e11d3533b8143c9356166e20a8c2920901bc5797dafe334e0

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: py_thanos_snap-0.1.2-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.2-py3-none-any.whl
Algorithm Hash digest
SHA256 dbf65452ed5691456437a18aec99dca4fecdba44847853599357c1b1ec42d0fc
MD5 80b4fc3ae1300400aee051cb77c42012
BLAKE2b-256 aab1c13db50e7f93498d0d2ee14a11804e41dd0fa99317c3adb519c300117fe2

See more details on using hashes here.

Provenance

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