Skip to content

Commit 7d648e5

Browse files
committedDec 18, 2018
Improve Python __repr__ handling for null geometries
Also avoid massive long __repr__ strings for complex geometries, as these can flood the Python console (and first aid plugin), and aren't useful for debugging anyway. Refs #14640
1 parent d072a13 commit 7d648e5

21 files changed

+102
-20
lines changed
 

‎python/core/auto_generated/geometry/qgscircularstring.sip.in

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,10 @@ Sets the circular string's points
168168

169169
SIP_PYOBJECT __repr__();
170170
%MethodCode
171-
QString str = QStringLiteral( "<QgsCircularString: %1>" ).arg( sipCpp->asWkt() );
171+
QString wkt = sipCpp->asWkt();
172+
if ( wkt.length() > 1000 )
173+
wkt = wkt.left( 1000 ) + QStringLiteral( "..." );
174+
QString str = QStringLiteral( "<QgsCircularString: %1>" ).arg( wkt );
172175
sipRes = PyUnicode_FromString( str.toUtf8().constData() );
173176
%End
174177

‎python/core/auto_generated/geometry/qgscompoundcurve.sip.in

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,10 @@ Appends first point if not already closed.
172172

173173
SIP_PYOBJECT __repr__();
174174
%MethodCode
175-
QString str = QStringLiteral( "<QgsCompoundCurve: %1>" ).arg( sipCpp->asWkt() );
175+
QString wkt = sipCpp->asWkt();
176+
if ( wkt.length() > 1000 )
177+
wkt = wkt.left( 1000 ) + QStringLiteral( "..." );
178+
QString str = QStringLiteral( "<QgsCompoundCurve: %1>" ).arg( wkt );
176179
sipRes = PyUnicode_FromString( str.toUtf8().constData() );
177180
%End
178181

‎python/core/auto_generated/geometry/qgscurvepolygon.sip.in

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,10 @@ Returns approximate rotation angle for a vertex. Usually average angle between a
274274

275275
SIP_PYOBJECT __repr__();
276276
%MethodCode
277-
QString str = QStringLiteral( "<QgsCurvePolygon: %1>" ).arg( sipCpp->asWkt() );
277+
QString wkt = sipCpp->asWkt();
278+
if ( wkt.length() > 1000 )
279+
wkt = wkt.left( 1000 ) + QStringLiteral( "..." );
280+
QString str = QStringLiteral( "<QgsCurvePolygon: %1>" ).arg( wkt );
278281
sipRes = PyUnicode_FromString( str.toUtf8().constData() );
279282
%End
280283

‎python/core/auto_generated/geometry/qgsgeometry.sip.in

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1391,7 +1391,16 @@ Exports the geometry to WKT
13911391

13921392
SIP_PYOBJECT __repr__();
13931393
%MethodCode
1394-
QString str = QStringLiteral( "<QgsGeometry: %1>" ).arg( sipCpp->asWkt() );
1394+
QString str;
1395+
if ( sipCpp->isNull() )
1396+
str = QStringLiteral( "<QgsGeometry: null>" );
1397+
else
1398+
{
1399+
QString wkt = sipCpp->asWkt();
1400+
if ( wkt.length() > 1000 )
1401+
wkt = wkt.left( 1000 ) + QStringLiteral( "..." );
1402+
str = QStringLiteral( "<QgsGeometry: %1>" ).arg( wkt );
1403+
}
13951404
sipRes = PyUnicode_FromString( str.toUtf8().constData() );
13961405
%End
13971406

‎python/core/auto_generated/geometry/qgslinestring.sip.in

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -501,7 +501,10 @@ of the curve.
501501

502502
SIP_PYOBJECT __repr__();
503503
%MethodCode
504-
QString str = QStringLiteral( "<QgsLineString: %1>" ).arg( sipCpp->asWkt() );
504+
QString wkt = sipCpp->asWkt();
505+
if ( wkt.length() > 1000 )
506+
wkt = wkt.left( 1000 ) + QStringLiteral( "..." );
507+
QString str = QStringLiteral( "<QgsLineString: %1>" ).arg( wkt );
505508
sipRes = PyUnicode_FromString( str.toUtf8().constData() );
506509
%End
507510

‎python/core/auto_generated/geometry/qgsmulticurve.sip.in

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,10 @@ Returns a copy of the multi curve, where each component curve has had its line d
5858

5959
SIP_PYOBJECT __repr__();
6060
%MethodCode
61-
QString str = QStringLiteral( "<QgsMultiCurve: %1>" ).arg( sipCpp->asWkt() );
61+
QString wkt = sipCpp->asWkt();
62+
if ( wkt.length() > 1000 )
63+
wkt = wkt.left( 1000 ) + QStringLiteral( "..." );
64+
QString str = QStringLiteral( "<QgsMultiCurve: %1>" ).arg( wkt );
6265
sipRes = PyUnicode_FromString( str.toUtf8().constData() );
6366
%End
6467

‎python/core/auto_generated/geometry/qgsmultilinestring.sip.in

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,10 @@ Returns the geometry converted to the more generic curve type :py:class:`QgsMult
5555

5656
SIP_PYOBJECT __repr__();
5757
%MethodCode
58-
QString str = QStringLiteral( "<QgsMultiLineString: %1>" ).arg( sipCpp->asWkt() );
58+
QString wkt = sipCpp->asWkt();
59+
if ( wkt.length() > 1000 )
60+
wkt = wkt.left( 1000 ) + QStringLiteral( "..." );
61+
QString str = QStringLiteral( "<QgsMultiLineString: %1>" ).arg( wkt );
5962
sipRes = PyUnicode_FromString( str.toUtf8().constData() );
6063
%End
6164

‎python/core/auto_generated/geometry/qgsmultipoint.sip.in

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,10 @@ Multi point geometry collection.
5757

5858
SIP_PYOBJECT __repr__();
5959
%MethodCode
60-
QString str = QStringLiteral( "<QgsMultiPoint: %1>" ).arg( sipCpp->asWkt() );
60+
QString wkt = sipCpp->asWkt();
61+
if ( wkt.length() > 1000 )
62+
wkt = wkt.left( 1000 ) + QStringLiteral( "..." );
63+
QString str = QStringLiteral( "<QgsMultiPoint: %1>" ).arg( wkt );
6164
sipRes = PyUnicode_FromString( str.toUtf8().constData() );
6265
%End
6366

‎python/core/auto_generated/geometry/qgsmultipolygon.sip.in

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,10 @@ Returns the geometry converted to the more generic curve type :py:class:`QgsMult
5656

5757
SIP_PYOBJECT __repr__();
5858
%MethodCode
59-
QString str = QStringLiteral( "<QgsMultiPolygon: %1>" ).arg( sipCpp->asWkt() );
59+
QString wkt = sipCpp->asWkt();
60+
if ( wkt.length() > 1000 )
61+
wkt = wkt.left( 1000 ) + QStringLiteral( "..." );
62+
QString str = QStringLiteral( "<QgsMultiPolygon: %1>" ).arg( wkt );
6063
sipRes = PyUnicode_FromString( str.toUtf8().constData() );
6164
%End
6265

‎python/core/auto_generated/geometry/qgspolygon.sip.in

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,10 @@ negative if the point lies outside the polygon.
6767

6868
SIP_PYOBJECT __repr__();
6969
%MethodCode
70-
QString str = QStringLiteral( "<QgsPolygon: %1>" ).arg( sipCpp->asWkt() );
70+
QString wkt = sipCpp->asWkt();
71+
if ( wkt.length() > 1000 )
72+
wkt = wkt.left( 1000 ) + QStringLiteral( "..." );
73+
QString str = QStringLiteral( "<QgsPolygon: %1>" ).arg( wkt );
7174
sipRes = PyUnicode_FromString( str.toUtf8().constData() );
7275
%End
7376

‎src/core/geometry/qgscircularstring.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,10 @@ class CORE_EXPORT QgsCircularString: public QgsCurve
152152
#ifdef SIP_RUN
153153
SIP_PYOBJECT __repr__();
154154
% MethodCode
155-
QString str = QStringLiteral( "<QgsCircularString: %1>" ).arg( sipCpp->asWkt() );
155+
QString wkt = sipCpp->asWkt();
156+
if ( wkt.length() > 1000 )
157+
wkt = wkt.left( 1000 ) + QStringLiteral( "..." );
158+
QString str = QStringLiteral( "<QgsCircularString: %1>" ).arg( wkt );
156159
sipRes = PyUnicode_FromString( str.toUtf8().constData() );
157160
% End
158161
#endif

‎src/core/geometry/qgscompoundcurve.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,10 @@ class CORE_EXPORT QgsCompoundCurve: public QgsCurve
152152
#ifdef SIP_RUN
153153
SIP_PYOBJECT __repr__();
154154
% MethodCode
155-
QString str = QStringLiteral( "<QgsCompoundCurve: %1>" ).arg( sipCpp->asWkt() );
155+
QString wkt = sipCpp->asWkt();
156+
if ( wkt.length() > 1000 )
157+
wkt = wkt.left( 1000 ) + QStringLiteral( "..." );
158+
QString str = QStringLiteral( "<QgsCompoundCurve: %1>" ).arg( wkt );
156159
sipRes = PyUnicode_FromString( str.toUtf8().constData() );
157160
% End
158161
#endif

‎src/core/geometry/qgscurvepolygon.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,10 @@ class CORE_EXPORT QgsCurvePolygon: public QgsSurface
286286
#ifdef SIP_RUN
287287
SIP_PYOBJECT __repr__();
288288
% MethodCode
289-
QString str = QStringLiteral( "<QgsCurvePolygon: %1>" ).arg( sipCpp->asWkt() );
289+
QString wkt = sipCpp->asWkt();
290+
if ( wkt.length() > 1000 )
291+
wkt = wkt.left( 1000 ) + QStringLiteral( "..." );
292+
QString str = QStringLiteral( "<QgsCurvePolygon: %1>" ).arg( wkt );
290293
sipRes = PyUnicode_FromString( str.toUtf8().constData() );
291294
% End
292295
#endif

‎src/core/geometry/qgsgeometry.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1392,7 +1392,16 @@ class CORE_EXPORT QgsGeometry
13921392
#ifdef SIP_RUN
13931393
SIP_PYOBJECT __repr__();
13941394
% MethodCode
1395-
QString str = QStringLiteral( "<QgsGeometry: %1>" ).arg( sipCpp->asWkt() );
1395+
QString str;
1396+
if ( sipCpp->isNull() )
1397+
str = QStringLiteral( "<QgsGeometry: null>" );
1398+
else
1399+
{
1400+
QString wkt = sipCpp->asWkt();
1401+
if ( wkt.length() > 1000 )
1402+
wkt = wkt.left( 1000 ) + QStringLiteral( "..." );
1403+
str = QStringLiteral( "<QgsGeometry: %1>" ).arg( wkt );
1404+
}
13961405
sipRes = PyUnicode_FromString( str.toUtf8().constData() );
13971406
% End
13981407
#endif

‎src/core/geometry/qgslinestring.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -635,7 +635,10 @@ class CORE_EXPORT QgsLineString: public QgsCurve
635635
#ifdef SIP_RUN
636636
SIP_PYOBJECT __repr__();
637637
% MethodCode
638-
QString str = QStringLiteral( "<QgsLineString: %1>" ).arg( sipCpp->asWkt() );
638+
QString wkt = sipCpp->asWkt();
639+
if ( wkt.length() > 1000 )
640+
wkt = wkt.left( 1000 ) + QStringLiteral( "..." );
641+
QString str = QStringLiteral( "<QgsLineString: %1>" ).arg( wkt );
639642
sipRes = PyUnicode_FromString( str.toUtf8().constData() );
640643
% End
641644

‎src/core/geometry/qgsmulticurve.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,10 @@ class CORE_EXPORT QgsMultiCurve: public QgsGeometryCollection
7676
#ifdef SIP_RUN
7777
SIP_PYOBJECT __repr__();
7878
% MethodCode
79-
QString str = QStringLiteral( "<QgsMultiCurve: %1>" ).arg( sipCpp->asWkt() );
79+
QString wkt = sipCpp->asWkt();
80+
if ( wkt.length() > 1000 )
81+
wkt = wkt.left( 1000 ) + QStringLiteral( "..." );
82+
QString str = QStringLiteral( "<QgsMultiCurve: %1>" ).arg( wkt );
8083
sipRes = PyUnicode_FromString( str.toUtf8().constData() );
8184
% End
8285
#endif

‎src/core/geometry/qgsmultilinestring.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,10 @@ class CORE_EXPORT QgsMultiLineString: public QgsMultiCurve
6868
#ifdef SIP_RUN
6969
SIP_PYOBJECT __repr__();
7070
% MethodCode
71-
QString str = QStringLiteral( "<QgsMultiLineString: %1>" ).arg( sipCpp->asWkt() );
71+
QString wkt = sipCpp->asWkt();
72+
if ( wkt.length() > 1000 )
73+
wkt = wkt.left( 1000 ) + QStringLiteral( "..." );
74+
QString str = QStringLiteral( "<QgsMultiLineString: %1>" ).arg( wkt );
7275
sipRes = PyUnicode_FromString( str.toUtf8().constData() );
7376
% End
7477
#endif

‎src/core/geometry/qgsmultipoint.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,10 @@ class CORE_EXPORT QgsMultiPoint: public QgsGeometryCollection
6969
#ifdef SIP_RUN
7070
SIP_PYOBJECT __repr__();
7171
% MethodCode
72-
QString str = QStringLiteral( "<QgsMultiPoint: %1>" ).arg( sipCpp->asWkt() );
72+
QString wkt = sipCpp->asWkt();
73+
if ( wkt.length() > 1000 )
74+
wkt = wkt.left( 1000 ) + QStringLiteral( "..." );
75+
QString str = QStringLiteral( "<QgsMultiPoint: %1>" ).arg( wkt );
7376
sipRes = PyUnicode_FromString( str.toUtf8().constData() );
7477
% End
7578
#endif

‎src/core/geometry/qgsmultipolygon.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,10 @@ class CORE_EXPORT QgsMultiPolygon: public QgsMultiSurface
6868
#ifdef SIP_RUN
6969
SIP_PYOBJECT __repr__();
7070
% MethodCode
71-
QString str = QStringLiteral( "<QgsMultiPolygon: %1>" ).arg( sipCpp->asWkt() );
71+
QString wkt = sipCpp->asWkt();
72+
if ( wkt.length() > 1000 )
73+
wkt = wkt.left( 1000 ) + QStringLiteral( "..." );
74+
QString str = QStringLiteral( "<QgsMultiPolygon: %1>" ).arg( wkt );
7275
sipRes = PyUnicode_FromString( str.toUtf8().constData() );
7376
% End
7477
#endif

‎src/core/geometry/qgspolygon.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,10 @@ class CORE_EXPORT QgsPolygon: public QgsCurvePolygon
8787
#ifdef SIP_RUN
8888
SIP_PYOBJECT __repr__();
8989
% MethodCode
90-
QString str = QStringLiteral( "<QgsPolygon: %1>" ).arg( sipCpp->asWkt() );
90+
QString wkt = sipCpp->asWkt();
91+
if ( wkt.length() > 1000 )
92+
wkt = wkt.left( 1000 ) + QStringLiteral( "..." );
93+
QString str = QStringLiteral( "<QgsPolygon: %1>" ).arg( wkt );
9194
sipRes = PyUnicode_FromString( str.toUtf8().constData() );
9295
% End
9396
#endif

‎tests/src/python/test_python_repr.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,19 @@
2626
class TestPython__repr__(unittest.TestCase):
2727

2828
def testQgsGeometryRepr(self):
29+
30+
g = QgsGeometry()
31+
self.assertEqual(g.__repr__(), '<QgsGeometry: null>')
2932
p = QgsPointXY(123.456, 987.654)
3033
g = QgsGeometry.fromPointXY(p)
3134
self.assertTrue(g.__repr__().startswith('<QgsGeometry: Point (123.456'))
35+
g = QgsGeometry(QgsLineString([QgsPoint(0, 2), QgsPoint(1010, 2)]))
36+
g = g.densifyByCount(1000)
37+
# long strings must be truncated for performance -- otherwise they flood the console/first aid output
38+
self.assertTrue(g.__repr__().startswith('<QgsGeometry: LineString (0 2,'))
39+
self.assertTrue(
40+
g.__repr__().endswith('...>'))
41+
self.assertEqual(len(g.__repr__()), 1018)
3242

3343
def testQgsPointRepr(self):
3444
p = QgsPoint(123.456, 987.654, 100)

0 commit comments

Comments
 (0)
Please sign in to comment.