Easily curry multiple functions to a given list of arguments without using classes
Project description
Classless
=============
Get all the benefits of making your functions methods on a class
without actually having define them methods on a class!
**Classless** allows you, instead,
to pass a list of functions to ```gen_class```
and curry them on the specified attributes.
Example:
.. code-block:: python
from classless import gen_class
def fun_stuff(db, name, x):
q = db.get(name)
return int(q) + x
def cool_stuff(q, z, name, y, db):
db.insert(name, (q, z, y))
def awesome_adventure(w, name):
if w > 5:
return name
else:
raise Exception("I don't approve of the name {}".format(name))
MyPretendClass = gen_class(methods=(fun_stuff,
cool_stuff,
awesome_adventure),
init_attrs=['db', 'name'])
and then we use ``MyPretendClass`` just like any regular class:
.. code-block:: python
obj = MyPretendClass(name='NiceName', db=some_connection)
obj.awesome_adventure(25) # Calls awesome_adventure with name='NiceName'
# and w=25
obj.cool_stuff(1,2,3) # == cool_stuff(1, 2, 'NiceName', 3, some_connection)
obj.fun_stuff('Dr. X') # == fun_stuff(x='Dr. X', name='NiceName',
# db=some_connection)
where ``obj`` just holds the list of ``methods`` curried on the ``init_attrs``.
We could have defined ``MyRealClass`` as so and get identical behaviour:
.. code-block:: python
class MyRealClass(object):
def __init__(self, db, name):
self.db = db
self.name = name
def fun_stuff(x):
q = self.db.get(self.name)
return int(q) + x
def cool_stuff(q, z, y):
self.db.insert(self.name, (q, z, y))
def awesome_adventure(w):
if w > 5:
return self.name
else:
raise Exception("I don't approve of the name {}".format(self.name))
But, then every one of those methods is tied down to a given class, and can't be used as regular functions, without first constructing ``MyRealClass``.
=============
Get all the benefits of making your functions methods on a class
without actually having define them methods on a class!
**Classless** allows you, instead,
to pass a list of functions to ```gen_class```
and curry them on the specified attributes.
Example:
.. code-block:: python
from classless import gen_class
def fun_stuff(db, name, x):
q = db.get(name)
return int(q) + x
def cool_stuff(q, z, name, y, db):
db.insert(name, (q, z, y))
def awesome_adventure(w, name):
if w > 5:
return name
else:
raise Exception("I don't approve of the name {}".format(name))
MyPretendClass = gen_class(methods=(fun_stuff,
cool_stuff,
awesome_adventure),
init_attrs=['db', 'name'])
and then we use ``MyPretendClass`` just like any regular class:
.. code-block:: python
obj = MyPretendClass(name='NiceName', db=some_connection)
obj.awesome_adventure(25) # Calls awesome_adventure with name='NiceName'
# and w=25
obj.cool_stuff(1,2,3) # == cool_stuff(1, 2, 'NiceName', 3, some_connection)
obj.fun_stuff('Dr. X') # == fun_stuff(x='Dr. X', name='NiceName',
# db=some_connection)
where ``obj`` just holds the list of ``methods`` curried on the ``init_attrs``.
We could have defined ``MyRealClass`` as so and get identical behaviour:
.. code-block:: python
class MyRealClass(object):
def __init__(self, db, name):
self.db = db
self.name = name
def fun_stuff(x):
q = self.db.get(self.name)
return int(q) + x
def cool_stuff(q, z, y):
self.db.insert(self.name, (q, z, y))
def awesome_adventure(w):
if w > 5:
return self.name
else:
raise Exception("I don't approve of the name {}".format(self.name))
But, then every one of those methods is tied down to a given class, and can't be used as regular functions, without first constructing ``MyRealClass``.
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
Classless-0.0.2.tar.gz
(3.2 kB
view details)
File details
Details for the file Classless-0.0.2.tar.gz
.
File metadata
- Download URL: Classless-0.0.2.tar.gz
- Upload date:
- Size: 3.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0228a3b73e406300f9e22d81deaa49a5530c6a5e68a813add093733e2d2dbea4 |
|
MD5 | d604f2708358028b3c2668541e27543f |
|
BLAKE2b-256 | 8c0abf3d1e910f58f7517714cdaa4378c235f3684b4fa99da602d1892f8eb726 |