method chaining in python
I was looking for something similar for chaining Class
functions and found no good answer, so here is what I did and thought was a very simple way of chaining: Simply return the self
object.
So here is my setup:
Class Car():
def __init__(self, name=None):
self.name = name
self.mode = 'init'
def set_name(self, name):
self.name = name
return self
def drive(self):
self.mode = 'drive'
return self
And now I can name the car and put it in drive state by calling:
my_car = Car()
my_car.set_name('Porche').drive()
Caveat: This only works on the class functions that do not intend to return any data.
Hope this helps!
There is a very handy Pipe
library which may be the answer to your question. For example::
seq = fib() | take_while(lambda x: x < 1000000) \
| where(lambda x: x % 2) \
| select(lambda x: x * x) \
| sum()
It's possible if you use only pure functions so that methods don't modify self.data
directly, but instead return the modified version. You also have to return Chainable
instances.
Here's an example using collection pipelining with lists:
import itertools
try:
import builtins
except ImportError:
import __builtin__ as builtins
class Chainable(object):
def __init__(self, data, method=None):
self.data = data
self.method = method
def __getattr__(self, name):
try:
method = getattr(self.data, name)
except AttributeError:
try:
method = getattr(builtins, name)
except AttributeError:
method = getattr(itertools, name)
return Chainable(self.data, method)
def __call__(self, *args, **kwargs):
try:
return Chainable(list(self.method(self.data, *args, **kwargs)))
except TypeError:
return Chainable(list(self.method(args[0], self.data, **kwargs)))
Use it like this:
chainable_list = Chainable([3, 1, 2, 0])
(chainable_list
.chain([11,8,6,7,9,4,5])
.sorted()
.reversed()
.ifilter(lambda x: x%2)
.islice(3)
.data)
>> [11, 9, 7]
Note that .chain
refers to itertools.chain
and not the OP's chain
.