tinytraitlet is a simple library that enables attribute validation and type checking for Traitful classes, inspired by traitlets library.
Usage
from tinytraitlet import Traitful, String, validate, TraitError
class User(Traitful):
name = String()
@validate('name')
def validate_name(self, value):
if value == 'undefined':
raise TraitError("Name cannot be 'undefined'")
class SubscriptionUser(User):
subscription = String()
@validate('subscription')
def validate_subscription(self, value):
if value not in ["monthly", "yearly"]:
raise TraitError("subscription must be either 'monthly' or 'yearly'")These classes behave as one would expect. @validate('name') decorator registers the validate_name method as the validator for the name trait. SubscriptionUser inherits both the name trait and the validate_name validator.
>>> user = User(name="Niki")
>>> user.name
'Niki'
>>> user = SubscriptionUser(name="undefined")
tinytraitlet.TraitError: Name cannot be 'undefined'
>>> user = SubscriptionUser(subscription="yearly")
>>> user.subscription
'yearly'
>>> user.subscription = "daily"
tinytraitlet.TraitError: subscription must be either 'monthly' or 'yearly'Defining custom types:
We should define default_value and model_type attributes. Example:
from tinytraitlet import Model
class Integer(Model):
default_value = 0
model_type = intWhy solve the same problem?
tinytraitlet does not use metaclasses unlike traitlets. This reduces the chance of metaclass conflict. tinytraitlet is a simple alternative, currently under 100 lines of code, and offers only the absolutely essential functionality.
Limitations
- Currently a single trait type is defined:
String. - Default values are not validated.
- Cross validation is not supported.
- A trait cannot have multiple validators