BasicReturns 🐍
Standardizes function return values across Python applications to enhance code consistency, readability, and maintainability.
📦 Installation
pip install BasicReturns
🚀 Quick Start
from BasicReturns import BasicReturn, DataAndMsgReturn
def divide_numbers(a: float, b: float) -> DataAndMsgReturn:
"""Safely divide two numbers with unified return structure."""
response = DataAndMsgReturn()
try:
if b == 0:
raise ZeroDivisionError("Cannot divide by zero")
response.data = a / b
response.msg = "Division completed successfully"
except Exception as e:
response.ok = False
response.error = e
response.msg = "Division failed"
return response
# Usage example
result = divide_numbers(10, 2)
if result.ok:
print(f"{result.msg}: {result.data}") # Division completed successfully: 5.0
else:
print(f"{result.msg}: {result.error}") # Division failed: Cannot divide by zero
🛠️ Practical Examples
File Operations Utility
Here's how to implement a file utility class using unified returns:
from io import TextIOWrapper
from pathlib import Path
import json
from typing import Any
from BasicReturns import BaseReturn, DataAndMsgReturn
class FilesUtils:
@staticmethod
def file_exists(filename: str) -> bool:
return Path(filename).is_file()
@staticmethod
def read_file(filename: str) -> DataAndMsgReturn:
"""Read file content with unified return structure."""
response = DataAndMsgReturn()
try:
if not FilesUtils.file_exists(filename):
response.ok = False
response.error = FileNotFoundError(f"File '{filename}' not found")
response.msg = "File does not exist"
return response
with open(filename, 'r', encoding='utf-8') as file:
response.data = file.read()
response.msg = f"Successfully read file: {filename}"
except Exception as e:
response.ok = False
response.error = e
response.msg = f"Error reading file: {filename}"
return response
@staticmethod
def read_json(filename: str) -> DataAndMsgReturn:
"""Read and parse JSON file with unified error handling."""
response = DataAndMsgReturn()
file_result = FilesUtils.read_file(filename)
if not file_result.ok:
# Propagate the error from read_file
response.ok = file_result.ok
response.error = file_result.error
response.msg = file_result.msg
return response
try:
response.data = json.loads(file_result.data)
response.msg = f"Successfully parsed JSON from: {filename}"
except json.JSONDecodeError as e:
response.ok = False
response.error = e
response.msg = f"Invalid JSON format in file: {filename}"
return response
@staticmethod
def write_json(filename: str, data: dict) -> BaseReturn:
"""Write dictionary to JSON file with atomic operation handling."""
response = BaseReturn()
try:
with open(filename, 'w', encoding='utf-8') as file:
json.dump(data, file, indent=2, sort_keys=True, ensure_ascii=False)
response.msg = f"Successfully wrote JSON to: {filename}"
except Exception as e:
response.ok = False
response.error = e
response.msg = f"Failed to write JSON file: {filename}"
return response
Usage in Application
# Read configuration file
config_result = FilesUtils.read_json("config.json")
if config_result.ok:
config = config_result.data
print("Configuration loaded:", config)
else:
print("Error loading config:", config_result.error)
# Fallback to default configuration
config = {"default": "settings"}
# Save user data
user_data = {"name": "John Doe", "email": "john@example.com"}
save_result = FilesUtils.write_json("users/john.json", user_data)
if save_result.ok:
print("User data saved successfully")
else:
print("Failed to save user data:", save_result.error)
# Handle the error appropriately
🌟 Best Practices
1. Consistent Error Handling
def process_data(data: Any) -> DataAndMsgReturn:
response = DataAndMsgReturn()
if not data:
response.ok = False
response.error = ValueError("Empty data provided")
response.msg = "Validation failed"
return response
# Process data...
response.data = processed_data
response.msg = "Data processed successfully"
return response
2. Chaining Operations
def load_and_validate_config() -> DataAndMsgReturn:
config_result = FilesUtils.read_json("config.json")
if not config_result.ok:
return config_result # Return the error immediately
validation_result = validate_config(config_result.data)
if not validation_result.ok:
return DataAndMsgReturn(
ok=False,
error=validation_result.error,
msg=f"Configuration validation failed: {validation_result.msg}"
)
return DataAndMsgReturn(
data=config_result.data,
msg="Configuration loaded and validated successfully"
)
3. API Integration
import requests
from BasicReturns import DataAndMsgReturn
def fetch_api_data(url: str) -> DataAndMsgReturn:
response = DataAndMsgReturn()
try:
api_response = requests.get(url, timeout=10)
api_response.raise_for_status()
response.data = api_response.json()
response.msg = f"Successfully fetched data from {url}"
except requests.exceptions.RequestException as e:
response.ok = False
response.error = e
response.msg = f"API request failed: {url}"
return response
📊 Benefits
✅ Consistent Error Handling - No more guessing return types or error formats
✅ Improved Readability - Clear success/failure states with contextual messages
✅ Better Debugging - Structured error information with stack traces when needed
✅ Type Safety - Full MyPy compatibility with proper type annotations
✅ Seamless Integration - Works with any Python framework or application
✅ Serialization Ready - Built-in to_dict() method for JSON/API responses
🤝 Contributing
Contributions are welcome! Please feel free to submit issues, feature requests, or pull requests.
- Fork the repository
- Create your feature branch (
git switch -c feature/amazing-feature) - Commit your changes (
git commit -m 'Add some amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a pull request
📄 License
Distributed under the MIT License. See LICENSE for more information.
Made with ❤️ for Python developers who value clean, consistent code
Metadata
Release files for BasicReturns 0.1.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| basicreturns-0.1.2.tar.gz | 6.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| basicreturns-0.1.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 12.6 kB
Release files / basicreturns-0.1.2.tar.gz
| Download URL | basicreturns-0.1.2.tar.gz |
|---|---|
| Size | 6.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
2e4f42e7338f1d7d9e079d2df8d5cceaaf6cb2696e70b20cbd365aeac5f98525
|
|
BLAKE2b-256 checksum How to use checksums |
c720ece5d405674e6a571ffdf23346beeadc8357ca547efc704365b79d8522c8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.6
|
Release files / basicreturns-0.1.2-py3-none-any.whl
| Download URL | basicreturns-0.1.2-py3-none-any.whl |
|---|---|
| Size | 6.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
6269c0a6c3a55edc80b3e1cc859a1b0c1735a47d7953d1ca9c54365dd4503145
|
|
BLAKE2b-256 checksum How to use checksums |
f4551664572017893b2b0372d64dc5ee16dde14f3caaeb371611e9a636ef34b1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.6
|