Skip to main content

Property support for attrs

Project description


Pypi Github PythonVers Travis building Codacy Codacy coverage

Property support for attrs


pip install attr_property


Definitaion of class with attr_propertys

import attr
from attr_property import attr_property, attr_property_class

class A:

  a = attr_property()
  b = attr.ib() # compatible with original attr.ib

Specification of getter, setter, and deleter

def a_getter(this, value):
    print('Property a has been accessed!')
    return value + 1
def a_setter(this, value):
    print(f'Property a has been set with value {value!r}')
def a_deleter(this):
    print('Property has been deleted!')

class A:
    a = attr_property(getter = a_getter, setter = a_setter, deleter = a_deleter)

a = A(a = 1)
# Property a has been set with value 1
# Property a has been accessed!
print('a.a =', a.a)
# a.a = 2
del a.a
# Property has been deleted!
# Error

Disabling deleter

class A:
    a = attr_property(deleter = False)

a = A(1)
del a.a
# AttributeError: can't delete attribute

Disabling setter

class A:
    # remember you can set init = True or
    # set any default values for it,
    # as setter will be called in __init__
    # this will cause AttributeError
    a = attr_property(init = False, setter = False, getter = lambda this, value: 2)

a = A()
a.a = 1
# AttributeError: can't set attribute

# OK to call getter
a.a == 2

Run attr.ib's converter and validator in setter

class A:
    a = attr_property(converter = int, validator_runtime = True, converter_runtime = True)

    def lessthan20(self, attribute, value):
        if value >= 20:
            raise ValueError("d should be less than 20.")

a = A('3')
# a.a == 3
a.a = '30'
# ValueError

Order of execution of setter:

  • Delete cached value
  • Run converter
  • Run validator
  • Run specified setter
  • Save value as raw value

Caching getter results

class A:
    a = attr_property(getter = lambda this, value: value + 1, cache = True)

a = A(1)
# a.a == 2
# will not do value + again
# validators and converters will be skipped, as well.

Accessing raw values before getter calculation

class A:
    a = attr_property(getter = lambda this, value: value + 1, convert  = int, raw = True)

a = A('1')
# a.a == 2
# a._a == 1 # converted value
a._a = 9
# AttributeError, it's readonly

Using a different prefix

class A:
    a = attr_property(getter = lambda this, value: value + 1, convert  = int, raw = 'raw_')

a = A('1')
# a.raw_a == 1

How does it work?

  • Hack attrs' _attrs_to_init_script function to insert codes to initiate self.__attrs_property_raw__ to save raw values and __attrs_property_cached__ to save cached values.
  • Create propertys for each attribute in class decorator attr_property_class.

Project details

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Files for attr-property, version 0.0.9
Filename, size File type Python version Upload date Hashes
Filename, size attr_property-0.0.9-py3-none-any.whl (4.5 kB) File type Wheel Python version py3 Upload date Hashes View hashes
Filename, size attr_property-0.0.9.tar.gz (4.8 kB) File type Source Python version None Upload date Hashes View hashes

Supported by

Elastic Elastic Search Pingdom Pingdom Monitoring Google Google BigQuery Sentry Sentry Error logging AWS AWS Cloud computing DataDog DataDog Monitoring Fastly Fastly CDN DigiCert DigiCert EV certificate StatusPage StatusPage Status page