self.nfields = field
- def __getitem__( self, key ):
-
- cdef int i = key
+ def _getindex( self, int index ):
+ '''return item at idx index'''
+ cdef int i = index
if i < 0: i += self.nfields
if i < 0: raise IndexError( "list index out of range" )
i += self.offset
if i >= self.nfields:
- raise IndexError( "list index out of range" )
+ raise IndexError( "list index out of range %i >= %i" % (i, self.nfields ))
return self.fields[i]
+ def __getitem__( self, key ):
+ if type(key) == int: return self._getindex( key )
+ # slice object
+ start, end, step = key.indices( self.nfields )
+ result = []
+ for index in range( start, end, step ):
+ result.append( self._getindex( index ) )
+ return result
+
def _setindex( self, index, value ):
'''set item at idx index.'''
cdef int idx = index
self.start = atoi( cstart ) - 1
self.end = atoi( cend )
-
+ self.nfields = 9
+
property contig:
'''contig of feature.'''
def __get__( self ): return self.contig
r = self.attributes
return [ x.strip().split(" ")[0] for x in r.split(";") if x.strip() != '' ]
- def __getitem__(self, item):
- return self.__getattr__( item )
+ def __getitem__(self, key):
+ return self.__getattr__( key )
def __getattr__(self, item ):
"""Generic lookup of attribute from GFF/GTF attributes
start += strlen(query) + 1
# skip gaps before
- while start[0] == " ": start += 1
+ while start[0] == ' ': start += 1
if start[0] == '"':
start += 1
end = start
while end[0] != '\0' and end[0] != '"': end += 1
- l = end - start + 1
- cpy = <char*>calloc( l, sizeof(char ) )
- if cpy == NULL: raise ValueError("out of memory" )
- memcpy( cpy, start, l )
- cpy[l-1] = '\0'
- result = cpy
- free(cpy)
+ l = end - start
+ result = PyString_FromStringAndSize( start, l )
return result
else:
return start
self.contig = self.fields[0]
# vcf counts from 1 - correct here
self.pos = atoi( self.fields[1] ) - 1
-
+
def __len__(self):
return max(0, self.nfields - 9)
+ property pos:
+ '''feature end (in 0-based open/closed coordinates).'''
+ def __get__( self ):
+ return self.pos
+
def __setattr__(self, key, value ):
'''set attribute.'''
if key == "pos":
cdef int idx
idx, f = self.map_key2field[key]
TupleProxy._setindex(self, idx, str(value) )
-
+