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 loops, showing per-iteration state and flow-control (break, continue, pass) so you can quickly see what executed and why.
Features
- Decorator-based: Add
@whyand 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, andpassexactly 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/exceptand additional control structures. - Support for
switch,gotoetc - Configurable
whileiteration 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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file whytrace-0.1.4.tar.gz.
File metadata
- Download URL: whytrace-0.1.4.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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fec13096184dd3564f15397f446e7b301c7792c14af1b139a8e15bbb1b6f6a20
|
|
| MD5 |
9b1ff13440c049b17281688631b44ab0
|
|
| BLAKE2b-256 |
3b638ea0a4c781387b49e80a1c97f65728304635b233b58795b6b69dbe7694b4
|
File details
Details for the file whytrace-0.1.4-py3-none-any.whl.
File metadata
- Download URL: whytrace-0.1.4-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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bf6d505c48b6f21971b2bd53eacfb6d746dd5098e098430d16441a983da0216d
|
|
| MD5 |
82f5f610500b3b4b613771fd798707b9
|
|
| BLAKE2b-256 |
a6b88e77a2b94139d616f3d76b3258bf31e753837dbd318b08d24611ce7ca7ee
|