Metadata-Version: 2.1
Name: easyclasses
Version: 1.0.1
Summary: Lightweight dataclass library.
Author: ZeroIntensity
Author-email: <zintensitydev@gmail.com>
License: MIT
Project-URL: Source, https://github.com/ZeroIntensity/easyclasses
Keywords: python,dataclasses,performance
Platform: UNKNOWN
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Description-Content-Type: text/markdown

# Easyclasses
## Lightweight alternative to dataclasses


### Quick Example
```py
from easyclasses import EasyClass

class MyClass(EasyClass):
    a: str
    b: str
    c: str = "test"

print(MyClass("a", "b", c="hi")) # MyClass(a='a', b='b', c='hi')
```

### Installation

#### Linux/Mac
```
python3 -m pip install -U easyclasses
```

#### Windows
```
py -3 -m pip install -U easyclasses
```

### Performance

Based on `benchmarks.py`, easyclasses is over 6x faster than the built-in dataclasses module.

On top of that, it's also outperforms `NamedTuple`.

### Usage

#### Basics
Easyclasses API is pretty similar to dataclasses.

The main difference between dataclasses is that easyclasses uses a subclass instead of a decorator, like so:

```py
from easyclasses import EasyClass

class MyEasyClass(EasyClass):
    a: str
```

You can also provide default arguments the same way:

```py
from easyclasses import EasyClass

class MyEasyClass(EasyClass):
    a: str
    b: str = "h"
```

You can pass subclass arguments to enable or disable certain features:

```py
from easyclasses import EasyClass

class MyEasyClass(EasyClass, eq=False, immutable=True):
    a: str

MyEasyClass("a") == MyEasyClass("a") # False
MyEasyClass("a").a = "test" # TypeError
```

If you aren't planning on using features like `__eq__`, then you can use `LightEasyClass`, which has features like that removed, allowing it to be faster than the normal `EasyClass`:

```py
from easyclasses import LightEasyClass

class MyEasyClass(LightEasyClass): # works the same
    a: str
```

#### Factories
If you need a default argument for a mutable object (such as `list` or `dict`), you can use the `factory` function:

```py
from easyclasses import EasyClass, factory

class MyEasyClass(EasyClass):
    a: list = factory(list)
```

#### Validators

You can set a validator using the `validator` function:

```py
from easyclasses import EasyClass, validator

class MyEasyClass(EasyClass):
    a: str = validator(str, lambda v: v == "hi")

MyEasyClass("hi") # OK
MyEasyClass("a") # AssertionError
```

You can even use it with `factory`:

```py
from easyclasses import EasyClass, validator, factory

class MyEasyClass(EasyClass):
    a: list = validator(factory(list), lambda v: v == [1])

MyEasyClass([1, 2]) # AssertionError
```

