Templated docstrings for Python classes.
Project description
documented
Templated docstrings for Python classes.
Features
- Describe your business logic in docstrings of your classes and exceptions;
- When printing an object or an exception, the library will substitute the placeholders in the docstring text with runtime values,
- And you (or your user) will see a human readable text.
Installation
pip install documented
Example
from dataclasses import dataclass
from documented import DocumentedError
@dataclass
class InsufficientWizardryLevel(DocumentedError):
"""
🧙 Your level of wizardry is insufficient ☹
Spell: {self.spell}
Minimum level required: {self.required_level}
Actual level: {self.actual_level} {self.comment}
Unseen University will be happy to assist in your training! 🎓
"""
spell: str
required_level: int
actual_level: int
@property
def comment(self) -> str:
if self.actual_level <= 0:
return '(You are Rincewind, right? Hi!)'
else:
return ''
raise InsufficientWizardryLevel(
spell='Animal transformation',
required_level=8,
actual_level=0,
)
which prints:
---------------------------------------------------------------------
InsufficientWizardryLevel Traceback (most recent call last)
<ipython-input-1-d8ccdb953cf6> in <module>
27
28
---> 29 raise InsufficientWizardryLevel(
30 spell='Animal transformation',
31 required_level=8,
InsufficientWizardryLevel:
🧙 Your level of wizardry is insufficient ☹
Spell: Animal transformation
Minimum level required: 8
Actual level: 0 (You are Rincewind, right? Hi!)
Unseen University will be happy to assist in your training! 🎓
Usage
- Template rendering is done using
str.format(). - That function receives the object instance as
selfkeyword argument. - From template, you can't call methods of the object, but you can access its fields and properties.
textwrap.dedent()is applied to the result, thus Python indentation rules do not corrupt the resulting message.
Dynamically computed pieces of content may be introduced using:
@property- or,
@cached_propertyfor performance.
You can also access elements of lists and dicts by index, for example: {self.countries[US]}.
Making your exceptions sane
-
Create your own exception classes in terms of your domain, to play a part in your business logic.
-
Do not use the word
ExceptionorErrorin their names. Your code shouldraisethings like:BalanceInsufficientPlanetNotFoundTetOfflineOrderDeclined
And should not:
ValueErrorExceptionCatastrophicalError
-
Store meaningful properties of your errors in fields of the exception classes.
-
Use
dataclasses,attrsorpydanticto save yourself from boilerplate in__init__()— and to get IDE support. -
Maintain docstrings of your exceptions to contain up-to-date, human readable descriptions of what they mean.
-
You will be stimulated to do this by
documented: when an exception happens, the docstring becomes actually useful.
Links
- About naming and abstracting things: Kevlin Henney. Seven Ineffective Coding Habits of Many Programmers
- Python: Better Typed Than You Think summarizes a number of ways to handle errors in Python programs
- dry-python/returns proposes to replace exceptions with monadic
Resultcontainer, which works great in Scala, Haskell, and Rust, — but arguably not everyone would want to adopt this approach in their Python codebase. - Exceptions as control flow, to the contrast, describes advantages of using exceptions to control your application.
Which actually explains the meaning of this little helper: if we're stuck with exceptions in Python, why not at least make them friendlier?
This project was generated with wemake-python-package. Current template version is: 5840464a31423422d7523897d854e92408eee6b8. See what is updated since then.
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 documented-0.1.2.tar.gz.
File metadata
- Download URL: documented-0.1.2.tar.gz
- Upload date:
- Size: 5.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.2.2 CPython/3.11.0 Linux/5.15.0-53-generic
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8c8536fc17ad716de4a49fd05efd8c50e7eb569bd29bad88308c4991f9aab2fe
|
|
| MD5 |
115a0b6707c9eedffdd0d902afc97a25
|
|
| BLAKE2b-256 |
cbcab66a0583bc50e5b54f627e258292f1ec9473f880e4aec74e34165f7af1ba
|
File details
Details for the file documented-0.1.2-py3-none-any.whl.
File metadata
- Download URL: documented-0.1.2-py3-none-any.whl
- Upload date:
- Size: 5.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.2.2 CPython/3.11.0 Linux/5.15.0-53-generic
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6419656a80c8356d59c74efa7036afb774aa38d14fd8ffd980f320fc71828c30
|
|
| MD5 |
7e5198ea71c94b62689b277118d6827e
|
|
| BLAKE2b-256 |
0e250e60655bd621ccbf00e2d743c3403369d74958979065002ec1b8c93424bb
|