Synthetic properties
April 11, 2013 ยท View on GitHub
Be synthetic with PySynthetic #############################
PySynthetic is a set of tools that aims to make writing Python classes shorter and "cleaner".
For instance, one can add properties and accessors (getters/setters) to a class with only one line of code (using respectively synthesize_property and synthesize_member decorators), thus making the code more than 5 times shorter (see examples_ ). One can even avoid the laborious task of members initialization by using the synthesize_constructor decorator that takes care of writing the __init__ method.
PySynthetic is also useful for applying strict type checking with no pain just by using the decorators' contract argument (see PyContracts <http://andreacensi.github.com/contracts/>_ ).
Help and ideas are appreciated! Thank you!
.. image:: https://api.flattr.com/button/flattr-badge-large.png :target: https://flattr.com/thing/1167227/
.. image:: https://www.paypalobjects.com/en_US/i/btn/btn_donate_SM.gif :target: https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=yjaaidi%40gmail%2ecom&lc=US&item_name=yjaaidi¤cy_code=EUR&bn=PP%2dDonationsBF%3abtn_donate_SM%2egif%3aNonHosted
Resources
Documentation <http://pysynthetic.readthedocs.org/>_Bug Tracker <http://github.com/yjaaidi/pysynthetic/issues>_Code <http://github.com/yjaaidi/pysynthetic>_Mailing List <https://groups.google.com/group/pysynthetic>_ pysynthetic@googlegroups.com
Installation
.. code-block:: shell
pip install pysynthetic
Or simply from the tarball or source code if you are not using pip.
.. code-block:: shell
python setup.py install
Examples
Synthetic properties
With PySynthetic, the following code (8 lines)...
.. code-block:: python
from synthetic import synthesize_constructor, synthesize_property
@synthesize_property('a', contract = int)
@synthesize_property('b', contract = list)
@synthesize_property('c', default = "", contract = str, read_only = True)
@synthesize_constructor()
class ShortAndClean(object):
pass
... replaces this (43 lines):
.. code-block:: python
from contracts import contract
class ThisHurtsMyKeyboard(object):
@contract
def __init__(self, a, b, c = ""):
"""
:type a: int
:type b: list
:type c: str
"""
self._a = a
self._b = b
self._c = c
@property
def a(self):
return self._a
@a.setter
@contract
def a(self, value):
"""
:type value: int
"""
self._a = value
@property
def b(self):
return self._b
@b.setter
@contract
def b(self, value):
"""
:type value: list
"""
self._b = value
@property
def c(self):
return self._c
Synthetic accessors
But, if you are more into accessors than properties, you can use synthesize_member decorator instead.
This way, the following code (8 lines)...
.. code-block:: python
from synthetic import synthesize_constructor, synthesize_member
@synthesize_member('a', contract = int)
@synthesize_member('b', contract = list)
@synthesize_member('c', default = "", contract = str, read_only = True)
@synthesize_constructor()
class ShortAndClean(object):
pass
...will replace this (37 lines):
.. code-block:: python
from contracts import contract
class ThisHurtsMyKeyboard(object):
@contract
def __init__(self, a, b, c = ""):
"""
:type a: int
:type b: list
:type c: str
"""
self._a = a
self._b = b
self._c = c
def a(self):
return self._a
@contract
def set_a(self, value):
"""
:type value: int
"""
self._a = value
def b(self):
return self._b
@contract
def set_b(self, value):
"""
:type value: list
"""
self._b = value
def c(self):
return self._c