1 | """ |
---|
2 | Classes for implementing `Pipeline`s composed of `Filter`s (intended to be |
---|
3 | subclassed). |
---|
4 | """ |
---|
5 | |
---|
6 | class Filter( object ): |
---|
7 | def __init__( self, **kwargs ): |
---|
8 | raise Exception("AbstractClass") |
---|
9 | |
---|
10 | def run( self, reader, writer ): |
---|
11 | for block in reader: |
---|
12 | block = self( block ) |
---|
13 | if block: writer( block ) |
---|
14 | |
---|
15 | def step( self, reader, writer ): |
---|
16 | block = reader.next() |
---|
17 | if not block: raise StopIteration |
---|
18 | block = self( block ) |
---|
19 | if block: writer( block ) |
---|
20 | |
---|
21 | def __call__( self, block ): |
---|
22 | raise Exception("AbstractMethod") |
---|
23 | |
---|
24 | class Pipeline( Filter ): |
---|
25 | def __init__( self, **kwargs ): |
---|
26 | self.pipeline = list() |
---|
27 | |
---|
28 | def __call__( self, block ): |
---|
29 | for function in pipeline: |
---|
30 | if not block: return block |
---|
31 | try: f = function.__call__ |
---|
32 | except: raise TypeError, "'" + function.__class__.__name__ + "' is not callable." |
---|
33 | block = f( block ) |
---|
34 | return block |
---|
35 | |
---|
36 | def append( self, function ): |
---|
37 | try: f = function.__call__ |
---|
38 | except: raise TypeError, "'" + function.__class__.__name__ + "' is not callable." |
---|
39 | return self.pipeline.append( function ) |
---|
40 | def remove( self, function ): |
---|
41 | return self.pipeline.remove( function ) |
---|
42 | def extend( self, pipeline ): |
---|
43 | for item in pipeline: |
---|
44 | self.append( item ) |
---|
45 | # Container interface |
---|
46 | def __len__( self ): return len( self.pipeline ) |
---|
47 | def __getitem__( self, key ): return self.pipeline[key] |
---|
48 | def __setitem__( self, key, value ): |
---|
49 | try: f = value.__call__ |
---|
50 | except: raise TypeError, "'" + value.__class__.__name__ + "' is not callable." |
---|
51 | return self.pipeline.__setitem__( key, value ) |
---|
52 | def __delitem__( self, key ): return self.pipeline.__delitem__( key ) |
---|
53 | def __iter__( self ): return self.pipeline.__iter__() |
---|
54 | def __contains__( self, item ): return self.pipeline.__contains__( item ) |
---|