Jelajahi Sumber

pygrass: Provide better error message when raster row index is out of range;
Raise IndexError (instead of fatal exit) when operating on a colsed map. This is a more Pyhtonic way.



git-svn-id: https://svn.osgeo.org/grass/grass/trunk@72315 15284696-431f-4ddb-bdfa-cd5b030d7da7

Maris Nartiss 7 tahun lalu
induk
melakukan
6d0cdb122e

+ 1 - 0
lib/python/pygrass/raster/__init__.py

@@ -53,6 +53,7 @@ class RasterRow(RasterAbstractBase):
         * No mathematical operation like __add__ and stuff for the Raster
           object (only for rows), since r.mapcalc is more sophisticated and
           faster
+        * Rises IndexError if [row] is out of range
 
         Examples:
 

+ 4 - 3
lib/python/pygrass/raster/abstract.py

@@ -11,7 +11,7 @@ import ctypes
 #
 # import GRASS modules
 #
-from grass.script import fatal, gisenv
+from grass.script import fatal, error, gisenv
 import grass.lib.gis as libgis
 import grass.lib.raster as libraster
 
@@ -334,11 +334,12 @@ class RasterAbstractBase(object):
             x, y = key
             return self.get(x, y)
         elif isinstance(key, int):
+            if not self.is_open():
+                raise IndexError("Can not operate on a closed map. Call open() first.")
             if key < 0:  # Handle negative indices
                 key += self._rows
             if key >= self._rows:
-                fatal(INDXOUTRANGE.format(key))
-                raise IndexError
+                raise IndexError("The row index {0} is out of range [0, {1}).".format(key, self._rows))
             return self.get_row(key)
         else:
             fatal("Invalid argument type.")

+ 14 - 3
lib/python/pygrass/raster/testsuite/test_raster.py

@@ -16,20 +16,20 @@ class RasterRowTestCase(TestCase):
         """Create test raster map and region"""
         cls.use_temp_region()
         cls.runModule("g.region", n=40, s=0, e=40, w=0, res=10)
-        cls.runModule("r.mapcalc", expression="%s = row() + (10.0 * col())"%(cls.name),
+        cls.runModule("r.mapcalc", expression="%s = row() + (10.0 * col())" % (cls.name),
                                    overwrite=True)
 
     @classmethod
     def tearDownClass(cls):
         """Remove the generated vector map, if exist"""
-        cls.runModule("g.remove", flags='f', type='raster', 
+        cls.runModule("g.remove", flags='f', type='raster',
                       name=cls.name)
         cls.del_temp_region()
 
     def test_type(self):
         r = RasterRow(self.name)
         r.open(mode='r')
-        self.assertTrue(r.mtype,'DCELL')
+        self.assertTrue(r.mtype, 'DCELL')
         r.close()
 
     def test_isopen(self):
@@ -77,6 +77,17 @@ class RasterRowTestCase(TestCase):
         r.open(mode='w', mtype='DCELL', overwrite=True)
         self.assertTrue(r.mtype, 'DCELL')
         r.close()
+    
+    def test_row_range(self):
+        r = RasterRow(self.name)
+        with self.assertRaises(IndexError):
+            # Map is not open yet
+            r[1]
+        with self.assertRaises(IndexError):
+            # Index is out of range
+            r.open()
+            r[9999]
+        r.close()
 
 
 if __name__ == '__main__':