A plugin extends power of attrs library.
Project description
Welcome to attrs_mate Documentation
attrs makes writing class a lot of more fun!
attrs_mate aims to bring more features to attrs, less code, and better code pattern.
Usage1: More Utility Methods
from attrs_mate import attr, AttrsClass
@attr.s
class User(AttrsClass):
id = attr.ib()
name = attr.ib()
user = User(id=1, name="Alice")
user.keys() # ["id", "name"]
user.values() # [1, "Alice"]
user.items() # [("id", 1), ("name": "Alice")]
user.to_dict() # {"id": 1, "name": "Alice"}
user.to_OrderedDict() # OrderedDict([("id", 1), ("name": "Alice")])
Usage2: Allow attrs to construct complex object from dict data.
Plus, this is an example of nesting schema.
import attr
from attrs_mate import AttrsClass
@attr.s
class Profile(AttrsClass):
"""
firstname, lastname, ssn are generic data type field.
"""
firstname = AttrsClass.ib_str() # default String Validator
lastname = AttrsClass.ib_str()
ssn = AttrsClass.ib_str()
@attr.s
class Degree(AttrsClass):
name = AttrsClass.ib_str()
year = AttrsClass.ib_int() # default Integer Validator
@attr.s
class People(AttrsClass):
"""
- ``profile`` is nested field.
- ``degrees`` is collection type field.
"""
id = AttrsClass.ib_int()
profile = Profile.ib_nested() # default Nested Schema Validator and Converter
degrees = Degree.ib_list() # default Nested Schema Validator and Converter
>>> people = People(
id=1,
profile=Profile(
firstname="David",
lastname="John",
ssn="123-45-6789",
),
degrees=[
Degree(name="Bachelor", year=2004),
Degree(name="Master", year=2006),
],
)
>>> people_data = people.to_dict()
>>> people_data
{
'id': 1,
'profile': {
'lastname': 'John', 'ssn': '123-45-6789', 'firstname': 'David'
},
'degrees': [
{'name': 'Bachelor', 'year': 2004},
{'name': 'Master', 'year': 2006}
]
}
>>> people = People.from_dict(people_data)
>>> people
People(id=1, profile=Profile(firstname='David', lastname='John', ssn='123-45-6789'), degrees=[Degree(name='Bachelor', year=2004), Degree(name='Master', year=2006)])
Or you can just pass nested schema in dictionary, it works the same:
>>> people = People(
id=1,
profile=dict(
firstname="David",
lastname="John",
ssn="123-45-6789",
),
degrees=[
dict(name="Bachelor", year=2004),
dict(name="Master", year=2006),
],
)
Usage3: Cached Instance and Property Attribute
from attrs_mate import attr, LazyClass
@attr.s
class User(LazyClass): # instance are cached
id = attr.ib()
lastname = attr.ib()
firstname = attr.ib()
uuid_called_count = attr.ib(default=0)
fullname_called_count = attr.ib(default=0)
@LazyClass.lazyproperty
def uuid(self):
self.uuid_called_count += 1
return self.id
@LazyClass.lazyproperty
def fullname(self): # property method are cached
self.fullname_called_count += 1
return "{} {}".format(self.lastname, self.firstname)
>>> user1 = User.lazymake(id=1, lastname="David", firstname="John")
>>> user1.fullname_called_count
0 # initially, fullname never been called
>>> user1.fullname
David John
>>> user1.fullname_called_count
1 # called once
>>> user1.fullname
David John
>>> user1.fullname_called_count
1 # User.fullname() not been called
# use factory method to create new instance
>>> user2 = User.lazymake(id=1, lastname="David", firstname="Kim")
>>> id(user1) == id(user2)
True # since
>>> user2.firstname == "John"
True
>>> user2.fullname_called_count
1 # already been called once, because it is actually user1
Install
attrs_mate is released on PyPI, so all you need is:
$ pip install attrs_mate
To upgrade to latest version:
$ pip install --upgrade attrs_mate
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
attrs_mate-1.0.2.tar.gz
(16.0 kB
view hashes)
Built Distribution
Close
Hashes for attrs_mate-1.0.2-py2.py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 8800efb8d0ae9501d1a4e611d749cc2d1b16cd1fa4cfb17a0f29fb656a70369f |
|
MD5 | 0b04bddf6c7c6415a8c95203273c3378 |
|
BLAKE2b-256 | da31cc38201a0ad0f2c5c863f4e08334da917e6656686e232df81a2c2229b8ac |