Skip to main content

A conditional logic visualizer for Python

Project description

whytrace

Explain and visualize why your Python function took a particular control-flow path for a given set of inputs.

whytrace helps evaluate your if / elif / else conditions (including short-circuiting and/or), and renders a rich, human-friendly decision tree. It also steps through for and while loops, showing per-iteration state and flow-control (break, continue, pass) so you can quickly see what executed and why.


Features

  • Decorator-based: Add @why and call your function as usual.
  • Rich console tree: Clear, colorized decision diagrams using rich.
  • Condition insight: Shows boolean short-circuiting (and/or) step-by-step.
  • Flow control: Displays break, continue, and pass exactly where they occur.
  • Zero app logic changes: Your function still runs and returns its normal result.

Installation

This project currently targets Python 3.9+

pip install whytrace

Quickstart

from whytrace import why

@why
def check_user(user):
    if user["is_active"] and user["age"] > 18:
        if user["age"] > 21:
            return "ALLOW"
    else:
        return "DENY"

result = check_user({"is_active": False, "age": 16})
print("Result:", result)

Example console output (trimmed):

check_user()
└── if user["is_active"] and user["age"] > 18
    ├── user["is_active"] → ❌
    └── ⛔ Short-circuited at user["is_active"]
└── else

Conditional Looping

@why
def process(items, user):
    for i in items:
        if user["active"] and i > 3:
            print("Active user")
        elif user["banned"]:
            print("blocked")
            continue
        else:
            print("skip")


process(
    items=[1, 4, 7],
    user={"active": True, "banned": True},
)

Example console output (trimmed):

process()
└── for i in items
    ├── iteration 0 → i = 1
    │   ├── if user['active'] and i > 3
    │   │   ├── user['active'] → ✅
    │   │   ├── i > 3 → ❌
    │   │   └── ⛔ Short-circuited at i > 3
    │   └── elif user['banned'] → ✅
    │       ├── continue
    │       └── ↩ continue to next iteration
    ├── iteration 1 → i = 4
    │   └── if user['active'] and i > 3
    │       ├── user['active'] → ✅
    │       └── i > 3 → ✅
    └── iteration 2 → i = 7
        └── if user['active'] and i > 3
            ├── user['active'] → ✅
            └── i > 3 → ✅
blocked
Active user
Active user


More Examples

Nested conditionals

See examples/nested.py:

from whytrace import why

@why
def access_control(user, resource):
    if user["active"]:
        if resource["public"]:
            print("Access granted")
        elif user["role"] == "admin":
            print("Admin access")
        else:
            print("Access denied")
    else:
        print("Inactive user")

access_control(
    user={"active": True, "role": "user"},
    resource={"public": False}
)

Loops, break/continue/pass

See examples/loop.py:

from whytrace import why

@why
def process(items, user):
    for i in items:
        if user["active"] and i > 3:
            print("Active user")
        elif user["banned"]:
            print("blocked")
        else:
            print("skip")

process(
    items=[1, 4, 7],
    user={"active": True, "banned": True},
)

Note : Checkout examples folder for further examples


Supported Constructs

  • if / elif / else
  • Boolean operations: and, or (with explicit short-circuit visibility)
  • Flow nodes: break, continue, pass

CLI-Free: Just Run Your Script

The easiest way to use whytrace is to decorate functions in your code and run your script normally:

python examples/credit_score.py
python examples/feature_flag.py
python examples/loop.py
python examples/multi_layer.py
python examples/nested.py

You’ll see a rich tree printed before the function’s return value.


Contributing

Ideas and PRs welcome! Useful areas to explore:

  • Support for try/except and additional control structures.
  • Support for switch , goto etc
  • Configurable while iteration caps.
  • Safer evaluation strategies and richer context controls.
  • Output adapters (e.g., HTML export) in addition to the console tree.

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

whytrace-0.1.3.tar.gz (8.1 kB view details)

Uploaded Source

Built Distribution

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

whytrace-0.1.3-py3-none-any.whl (7.7 kB view details)

Uploaded Python 3

File details

Details for the file whytrace-0.1.3.tar.gz.

File metadata

  • Download URL: whytrace-0.1.3.tar.gz
  • Upload date:
  • Size: 8.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.2

File hashes

Hashes for whytrace-0.1.3.tar.gz
Algorithm Hash digest
SHA256 c7f4482b09d2e746402cc0fbb0fce3773c23921b8c822abea80943139a7fe154
MD5 8b8b268df65c41251482da5a3ee871f1
BLAKE2b-256 f3e3635f574a3cd6cdb03a9e2e6b7935121707952cd124f81050f0dd3eadc81b

See more details on using hashes here.

File details

Details for the file whytrace-0.1.3-py3-none-any.whl.

File metadata

  • Download URL: whytrace-0.1.3-py3-none-any.whl
  • Upload date:
  • Size: 7.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.2

File hashes

Hashes for whytrace-0.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 7a33be8836f077dfc1be9a8aff0d32caa578aa5611154544e3cfcd82255f2ec7
MD5 b2dc456cbbf6f39870a0cbea735866b7
BLAKE2b-256 1e4c6458f3a56378f89e2d6359186909b1c520ccd41fbb0e4c9bb36894b21ba7

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