Package: gyver-attrs
Gyver AttrsGyver-attrs is a Python library that provides a more flexible and feature-rich alternative to the built-in attrs and dataclasses libraries for defining classes. The main function provided by Gyver-attrs is define, which allows users to define classes with a range of options and features.InstallationTo install Gyver-attrs, you can use pip:pip install gyver-attrsUsageThe primary function in Gyver-attrs is define. It takes a list of field definitions and returns a new class with those fields defined as attributes. Here is a basic example:fromgyver_attrsimportdefine,info@defineclassPerson:name:strage:int=info(default=18)This defines a new classPersonwith two attributes,nameandage.FeaturesGyver-attrs provides a range of features that can be used to customize how classes are defined. These features include:maybe_cls: This option allows you to optionally specify the class to be created with the features applied. If it is None, it returns a callable that can wrap classes in the same way.frozen: This option replaces__setattr__and__getattr__of the class with frozen versions that raise AttributeError when attributes are accessed or modified. This can be useful for creating immutable objects.kw_only: This option makes the class's__init__not accept positional arguments, forcing all arguments to be passed as keyword arguments.slots: This option adds a__slots__to the class with the necessary validations and compliances with inheritance. It also validates possible descriptors with__set_name__to add the expected name to the__slots__.repr: This option adds a__repr__method to the resulting class.eq: This option provides__eq__and__ne__methods for the resulting class, comparing all values against each other. Each field can have a parser or opt-out using field(eq=False) or field(eq=my_converter).order: This option adds rich comparison support and supports the same mechanism of opt-out/converter as eq.hash: This option adds a hash function if all values are hashable and considers the converter from eq as well.pydantic: This option adds__get_validators__to the class to make Pydantic support the classes by default.dataclass_support: This option adds__dataclass_fields__with each field converted to a dataclass.Field before returning it on a dict. This way, the class becomes a drop-in replacement for dataclasses.Warning: dataclass_fields with pydantic=False will fail when trying to use with pydantic.MethodsGyver-attrs will add the following methods to your class.gyver_attrs: This is a dictionary that maps each attribute name to its corresponding Field object. The Field object contains metadata about the attribute such as its name, type, default value, etc.parse_dict(): This is a method that is used to parse the instance into a dict, recursively. Don't use it directly, instead callasdict(self).iter(): This will yield (key, value) for all fields directly included in the class, and not any fields of nested objects. You can use asdict(self)gserialize(): This is a class method that is used to serialize a dict into an instance of the class. Don't use it directly, instead callfromdict(self).pydantic_validate(): This will validate inputs to support pydantic integration.get_validators(): This is a classmethod to make your class pydantic-compatible.modify_schema(): This is a class method that create schemas for your class when using Pydantic/FastAPI.Also Gyver-attrs will not override custom defined functions instead, on conflict, you can still find them with the prefix__gattrs_.
Examples:__init__=>__gattrs_init____hash__=>__gattrs_hash____parse_dict__=>__gattrs_parse_dict__Helper FunctionsGyver-attrs provides helpers to integrate easily with your projectShortcutsmutable: same asdefinebut with frozen=Truekw_only: same asdefinebut with kw_only=TrueCameldefine_camel: same asdefinebut with alias automatically as camel case. This can be either lower or upper camel which can be done bystyle="upper"orstyle="lower. By defaultdefine_cameluses lower.Helpers:call_init: calls__gattrs_init__without mypy or pyright complainingfields: returns adict[str, Field]of the class, by returning__gyver_attrs__Factory:mark_factory: decorator to mark function as factoryConverters:fromdict/fromjson: creates instance of class based on a dict/json(using orjson). Use asfromdict(YourClass, mapping)orfromjson(YourClass, yourjson)asdict/asjson: returns your instance as dict/json(using orjson) recursively. Use asasdict(instance, by_alias=True)orasdict(instance, by_alias=False)ConclusionGyver-attrs provides a powerful and flexible way to define classes in Python, with a range of options and features that can be used to customize the behavior of the resulting classes. Whether you're building small scripts or large applications, Gyver-attrs can help you create classes that are tailored to your specific needs.