Browse Source

Replaced print statement by print function (forward compatibility syntax).

Claude Paroz 13 years ago
parent
commit
596cb9c7e2
61 changed files with 310 additions and 310 deletions
  1. 1 1
      django/bin/profiling/gather_profile_stats.py
  2. 1 1
      django/bin/unique-messages.py
  3. 1 1
      django/contrib/auth/management/__init__.py
  4. 3 3
      django/contrib/contenttypes/management.py
  5. 1 1
      django/contrib/gis/db/backends/spatialite/creation.py
  6. 8 8
      django/contrib/gis/gdal/geometries.py
  7. 12 12
      django/contrib/gis/gdal/srs.py
  8. 2 2
      django/contrib/gis/gdal/tests/test_ds.py
  9. 2 2
      django/contrib/gis/gdal/tests/test_geom.py
  10. 6 6
      django/contrib/gis/geos/tests/test_geos.py
  11. 9 9
      django/contrib/gis/utils/ogrinfo.py
  12. 2 2
      django/contrib/gis/utils/ogrinspect.py
  13. 2 2
      django/contrib/sites/management.py
  14. 2 2
      django/core/management/__init__.py
  15. 1 1
      django/core/management/sql.py
  16. 8 8
      django/core/servers/fastcgi.py
  17. 7 7
      django/db/backends/creation.py
  18. 14 14
      django/db/backends/oracle/creation.py
  19. 2 2
      django/db/backends/sqlite3/creation.py
  20. 3 3
      django/dispatch/saferef.py
  21. 24 24
      django/test/_doctest.py
  22. 1 1
      django/utils/dateformat.py
  23. 5 5
      django/utils/termcolors.py
  24. 2 2
      django/utils/unittest/main.py
  25. 3 3
      docs/_ext/applyxrefs.py
  26. 5 5
      docs/_ext/literals_to_xrefs.py
  27. 1 1
      docs/howto/custom-model-fields.txt
  28. 1 1
      docs/intro/install.txt
  29. 1 1
      docs/ref/contrib/gis/db-api.txt
  30. 12 12
      docs/ref/contrib/gis/gdal.txt
  31. 8 8
      docs/ref/contrib/gis/geoquerysets.txt
  32. 1 1
      docs/ref/contrib/gis/geos.txt
  33. 4 4
      docs/ref/contrib/gis/layermapping.txt
  34. 11 11
      docs/ref/contrib/gis/measure.txt
  35. 12 12
      docs/ref/contrib/gis/tutorial.txt
  36. 1 1
      docs/ref/contrib/syndication.txt
  37. 34 34
      docs/ref/forms/api.txt
  38. 7 7
      docs/ref/forms/fields.txt
  39. 1 1
      docs/ref/models/instances.txt
  40. 3 3
      docs/ref/models/querysets.txt
  41. 3 3
      docs/ref/template-response.txt
  42. 1 1
      docs/ref/templates/api.txt
  43. 3 3
      docs/topics/auth.txt
  44. 2 2
      docs/topics/db/examples/many_to_many.txt
  45. 10 10
      docs/topics/db/queries.txt
  46. 4 4
      docs/topics/db/sql.txt
  47. 8 8
      docs/topics/forms/formsets.txt
  48. 8 8
      docs/topics/forms/media.txt
  49. 2 2
      docs/topics/forms/modelforms.txt
  50. 1 1
      docs/topics/http/urls.txt
  51. 1 1
      docs/topics/i18n/translation.txt
  52. 1 1
      docs/topics/install.txt
  53. 2 2
      docs/topics/signals.txt
  54. 1 1
      docs/topics/signing.txt
  55. 16 16
      extras/csrf_migration_helper.py
  56. 1 1
      tests/regressiontests/admin_scripts/management/commands/app_command.py
  57. 1 1
      tests/regressiontests/admin_scripts/management/commands/base_command.py
  58. 1 1
      tests/regressiontests/admin_scripts/management/commands/label_command.py
  59. 1 1
      tests/regressiontests/admin_scripts/management/commands/noargs_command.py
  60. 1 1
      tests/regressiontests/test_runner/tests.py
  61. 18 18
      tests/runtests.py

+ 1 - 1
django/bin/profiling/gather_profile_stats.py

@@ -24,7 +24,7 @@ def gather_stats(p):
             prof = stats.load(os.path.join(p, f))
         else:
             continue
-        print "Processing %s" % f
+        print("Processing %s" % f)
         if path in profiles:
             profiles[path].add(prof)
         else:

+ 1 - 1
django/bin/unique-messages.py

@@ -11,7 +11,7 @@ def unique_messages():
     elif os.path.isdir('locale'):
         basedir = os.path.abspath('locale')
     else:
-        print "This script should be run from the Django Git tree or your project or app tree."
+        print("This script should be run from the Django Git tree or your project or app tree.")
         sys.exit(1)
 
     for (dirpath, dirnames, filenames) in os.walk(basedir):

+ 1 - 1
django/contrib/auth/management/__init__.py

@@ -54,7 +54,7 @@ def create_permissions(app, created_models, verbosity, **kwargs):
     auth_app.Permission.objects.bulk_create(objs)
     if verbosity >= 2:
         for obj in objs:
-            print "Adding permission '%s'" % obj
+            print("Adding permission '%s'" % obj)
 
 
 def create_superuser(app, created_models, verbosity, db, **kwargs):

+ 3 - 3
django/contrib/contenttypes/management.py

@@ -39,7 +39,7 @@ def update_contenttypes(app, created_models, verbosity=2, **kwargs):
     ])
     if verbosity >= 2:
         for ct in cts:
-            print "Adding content type '%s | %s'" % (ct.app_label, ct.model)
+            print("Adding content type '%s | %s'" % (ct.app_label, ct.model))
 
     # Confirm that the content type is stale before deletion.
     if to_remove:
@@ -63,11 +63,11 @@ If you're unsure, answer 'no'.
         if ok_to_delete == 'yes':
             for ct in to_remove:
                 if verbosity >= 2:
-                    print "Deleting stale content type '%s | %s'" % (ct.app_label, ct.model)
+                    print("Deleting stale content type '%s | %s'" % (ct.app_label, ct.model))
                 ct.delete()
         else:
             if verbosity >= 2:
-                print "Stale content types remain."
+                print("Stale content types remain.")
 
 def update_all_contenttypes(verbosity=2, **kwargs):
     for app in get_apps():

+ 1 - 1
django/contrib/gis/db/backends/spatialite/creation.py

@@ -24,7 +24,7 @@ class SpatiaLiteCreation(DatabaseCreation):
             test_db_repr = ''
             if verbosity >= 2:
                 test_db_repr = " ('%s')" % test_database_name
-            print "Creating test database for alias '%s'%s..." % (self.connection.alias, test_db_repr)
+            print("Creating test database for alias '%s'%s..." % (self.connection.alias, test_db_repr))
 
         self._create_test_db(verbosity, autoclobber)
 

+ 8 - 8
django/contrib/gis/gdal/geometries.py

@@ -13,21 +13,21 @@
   >>> from django.contrib.gis.gdal import OGRGeometry, OGRGeomType, SpatialReference
   >>> wkt1, wkt2 = 'POINT(-90 30)', 'POLYGON((0 0, 5 0, 5 5, 0 5)'
   >>> pnt = OGRGeometry(wkt1)
-  >>> print pnt
+  >>> print(pnt)
   POINT (-90 30)
   >>> mpnt = OGRGeometry(OGRGeomType('MultiPoint'), SpatialReference('WGS84'))
   >>> mpnt.add(wkt1)
   >>> mpnt.add(wkt1)
-  >>> print mpnt
+  >>> print(mpnt)
   MULTIPOINT (-90 30,-90 30)
-  >>> print mpnt.srs.name
+  >>> print(mpnt.srs.name)
   WGS 84
-  >>> print mpnt.srs.proj
+  >>> print(mpnt.srs.proj)
   +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs
   >>> mpnt.transform_to(SpatialReference('NAD27'))
-  >>> print mpnt.proj
+  >>> print(mpnt.proj)
   +proj=longlat +ellps=clrk66 +datum=NAD27 +no_defs
-  >>> print mpnt
+  >>> print(mpnt)
   MULTIPOINT (-89.999930378602485 29.999797886557641,-89.999930378602485 29.999797886557641)
 
   The OGRGeomType class is to make it easy to specify an OGR geometry type:
@@ -35,8 +35,8 @@
   >>> gt1 = OGRGeomType(3) # Using an integer for the type
   >>> gt2 = OGRGeomType('Polygon') # Using a string
   >>> gt3 = OGRGeomType('POLYGON') # It's case-insensitive
-  >>> print gt1 == 3, gt1 == 'Polygon' # Equivalence works w/non-OGRGeomType objects
-  True
+  >>> print(gt1 == 3, gt1 == 'Polygon') # Equivalence works w/non-OGRGeomType objects
+  True True
 """
 # Python library requisites.
 import sys

+ 12 - 12
django/contrib/gis/gdal/srs.py

@@ -4,7 +4,7 @@
   Example:
   >>> from django.contrib.gis.gdal import SpatialReference
   >>> srs = SpatialReference('WGS84')
-  >>> print srs
+  >>> print(srs)
   GEOGCS["WGS 84",
       DATUM["WGS_1984",
           SPHEROID["WGS 84",6378137,298.257223563,
@@ -16,14 +16,14 @@
       UNIT["degree",0.01745329251994328,
           AUTHORITY["EPSG","9122"]],
       AUTHORITY["EPSG","4326"]]
-  >>> print srs.proj
+  >>> print(srs.proj)
   +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs
-  >>> print srs.ellipsoid
+  >>> print(srs.ellipsoid)
   (6378137.0, 6356752.3142451793, 298.25722356300003)
-  >>> print srs.projected, srs.geographic
+  >>> print(srs.projected, srs.geographic)
   False True
   >>> srs.import_epsg(32140)
-  >>> print srs.name
+  >>> print(srs.name)
   NAD83 / Texas South Central
 """
 from ctypes import byref, c_char_p, c_int
@@ -103,19 +103,19 @@ class SpatialReference(GDALBase):
 
         >>> wkt = 'GEOGCS["WGS 84", DATUM["WGS_1984, ... AUTHORITY["EPSG","4326"]]')
         >>> srs = SpatialReference(wkt) # could also use 'WGS84', or 4326
-        >>> print srs['GEOGCS']
+        >>> print(srs['GEOGCS'])
         WGS 84
-        >>> print srs['DATUM']
+        >>> print(srs['DATUM'])
         WGS_1984
-        >>> print srs['AUTHORITY']
+        >>> print(srs['AUTHORITY'])
         EPSG
-        >>> print srs['AUTHORITY', 1] # The authority value
+        >>> print(srs['AUTHORITY', 1]) # The authority value
         4326
-        >>> print srs['TOWGS84', 4] # the fourth value in this wkt
+        >>> print(srs['TOWGS84', 4]) # the fourth value in this wkt
         0
-        >>> print srs['UNIT|AUTHORITY'] # For the units authority, have to use the pipe symbole.
+        >>> print(srs['UNIT|AUTHORITY']) # For the units authority, have to use the pipe symbole.
         EPSG
-        >>> print srs['UNIT|AUTHORITY', 1] # The authority value for the untis
+        >>> print(srs['UNIT|AUTHORITY', 1]) # The authority value for the untis
         9122
         """
         if isinstance(target, tuple):

+ 2 - 2
django/contrib/gis/gdal/tests/test_ds.py

@@ -59,7 +59,7 @@ class DataSourceTest(unittest.TestCase):
 
     def test03a_layers(self):
         "Testing Data Source Layers."
-        print "\nBEGIN - expecting out of range feature id error; safe to ignore.\n"
+        print("\nBEGIN - expecting out of range feature id error; safe to ignore.\n")
         for source in ds_list:
             ds = DataSource(source.ds)
 
@@ -108,7 +108,7 @@ class DataSourceTest(unittest.TestCase):
                         # the feature values here while in this loop.
                         for fld_name in fld_names:
                             self.assertEqual(source.field_values[fld_name][i], feat.get(fld_name))
-        print "\nEND - expecting out of range feature id error; safe to ignore."
+        print("\nEND - expecting out of range feature id error; safe to ignore.")
 
     def test03b_layer_slice(self):
         "Test indexing and slicing on Layers."

+ 2 - 2
django/contrib/gis/gdal/tests/test_geom.py

@@ -234,7 +234,7 @@ class OGRGeomTest(unittest.TestCase, TestDataMixin):
         # Both rings in this geometry are not closed.
         poly = OGRGeometry('POLYGON((0 0, 5 0, 5 5, 0 5), (1 1, 2 1, 2 2, 2 1))')
         self.assertEqual(8, poly.point_count)
-        print "\nBEGIN - expecting IllegalArgumentException; safe to ignore.\n"
+        print("\nBEGIN - expecting IllegalArgumentException; safe to ignore.\n")
         try:
             c = poly.centroid
         except OGRException:
@@ -242,7 +242,7 @@ class OGRGeomTest(unittest.TestCase, TestDataMixin):
             pass
         else:
             self.fail('Should have raised an OGRException!')
-        print "\nEND - expecting IllegalArgumentException; safe to ignore.\n"
+        print("\nEND - expecting IllegalArgumentException; safe to ignore.\n")
 
         # Closing the rings -- doesn't work on GDAL versions 1.4.1 and below:
         # http://trac.osgeo.org/gdal/ticket/1673

+ 6 - 6
django/contrib/gis/geos/tests/test_geos.py

@@ -134,7 +134,7 @@ class GEOSTest(unittest.TestCase, TestDataMixin):
     def test01d_errors(self):
         "Testing the Error handlers."
         # string-based
-        print "\nBEGIN - expecting GEOS_ERROR; safe to ignore.\n"
+        print("\nBEGIN - expecting GEOS_ERROR; safe to ignore.\n")
         for err in self.geometries.errors:
             try:
                 g = fromstr(err.wkt)
@@ -144,7 +144,7 @@ class GEOSTest(unittest.TestCase, TestDataMixin):
         # Bad WKB
         self.assertRaises(GEOSException, GEOSGeometry, buffer('0'))
 
-        print "\nEND - expecting GEOS_ERROR; safe to ignore.\n"
+        print("\nEND - expecting GEOS_ERROR; safe to ignore.\n")
 
         class NotAGeometry(object):
             pass
@@ -439,7 +439,7 @@ class GEOSTest(unittest.TestCase, TestDataMixin):
 
     def test05b_multipolygons(self):
         "Testing MultiPolygon objects."
-        print "\nBEGIN - expecting GEOS_NOTICE; safe to ignore.\n"
+        print("\nBEGIN - expecting GEOS_NOTICE; safe to ignore.\n")
         prev = fromstr('POINT (0 0)')
         for mp in self.geometries.multipolygons:
             mpoly = fromstr(mp.wkt)
@@ -458,7 +458,7 @@ class GEOSTest(unittest.TestCase, TestDataMixin):
                     self.assertEqual(p.valid, True)
                 self.assertEqual(mpoly.wkt, MultiPolygon(*tuple(poly.clone() for poly in mpoly)).wkt)
 
-        print "\nEND - expecting GEOS_NOTICE; safe to ignore.\n"
+        print("\nEND - expecting GEOS_NOTICE; safe to ignore.\n")
 
     def test06a_memory_hijinks(self):
         "Testing Geometry __del__() on rings and polygons."
@@ -995,7 +995,7 @@ class GEOSTest(unittest.TestCase, TestDataMixin):
         self.assertTrue(isinstance(g.valid_reason, basestring))
         self.assertEqual(g.valid_reason, "Valid Geometry")
 
-        print "\nBEGIN - expecting GEOS_NOTICE; safe to ignore.\n"
+        print("\nBEGIN - expecting GEOS_NOTICE; safe to ignore.\n")
 
         g = GEOSGeometry("LINESTRING(0 0, 0 0)")
 
@@ -1003,7 +1003,7 @@ class GEOSTest(unittest.TestCase, TestDataMixin):
         self.assertTrue(isinstance(g.valid_reason, basestring))
         self.assertTrue(g.valid_reason.startswith("Too few points in geometry component"))
 
-        print "\nEND - expecting GEOS_NOTICE; safe to ignore.\n"
+        print("\nEND - expecting GEOS_NOTICE; safe to ignore.\n")
 
     def test28_geos_version(self):
         "Testing the GEOS version regular expression."

+ 9 - 9
django/contrib/gis/utils/ogrinfo.py

@@ -22,19 +22,19 @@ def ogrinfo(data_source, num_features=10):
         raise Exception('Data source parameter must be a string or a DataSource object.')
 
     for i, layer in enumerate(data_source):
-        print "data source : %s" % data_source.name
-        print "==== layer %s" % i
-        print "  shape type: %s" % GEO_CLASSES[layer.geom_type.num].__name__
-        print "  # features: %s" % len(layer)
-        print "         srs: %s" % layer.srs
+        print("data source : %s" % data_source.name)
+        print("==== layer %s" % i)
+        print("  shape type: %s" % GEO_CLASSES[layer.geom_type.num].__name__)
+        print("  # features: %s" % len(layer))
+        print("         srs: %s" % layer.srs)
         extent_tup = layer.extent.tuple
-        print "      extent: %s - %s" % (extent_tup[0:2], extent_tup[2:4])
-        print "Displaying the first %s features ====" % num_features
+        print("      extent: %s - %s" % (extent_tup[0:2], extent_tup[2:4]))
+        print("Displaying the first %s features ====" % num_features)
 
         width = max(*map(len,layer.fields))
         fmt = " %%%ss: %%s" % width
         for j, feature in enumerate(layer[:num_features]):
-            print "=== Feature %s" % j
+            print("=== Feature %s" % j)
             for fld_name in layer.fields:
                 type_name = feature[fld_name].type_name
                 output = fmt % (fld_name, type_name)
@@ -47,7 +47,7 @@ def ogrinfo(data_source, num_features=10):
                     output += val_fmt % val
                 else:
                     output += ' (None)'
-                print output
+                print(output)
 
 # For backwards compatibility.
 sample = ogrinfo

+ 2 - 2
django/contrib/gis/utils/ogrinspect.py

@@ -68,8 +68,8 @@ def ogrinspect(*args, **kwargs):
     shp_file = 'data/mapping_hacks/world_borders.shp'
     model_name = 'WorldBorders'
 
-    print ogrinspect(shp_file, model_name, multi_geom=True, srid=4326,
-                     geom_name='shapes', blank=True)
+    print(ogrinspect(shp_file, model_name, multi_geom=True, srid=4326,
+                     geom_name='shapes', blank=True))
 
     Required Arguments
      `datasource` => string or DataSource object to file pointer

+ 2 - 2
django/contrib/sites/management.py

@@ -18,7 +18,7 @@ def create_default_site(app, created_models, verbosity, db, **kwargs):
         # the next id will be 1, so we coerce it. See #15573 and #16353. This
         # can also crop up outside of tests - see #15346.
         if verbosity >= 2:
-            print "Creating example.com Site object"
+            print("Creating example.com Site object")
         Site(pk=1, domain="example.com", name="example.com").save(using=db)
 
         # We set an explicit pk instead of relying on auto-incrementation,
@@ -26,7 +26,7 @@ def create_default_site(app, created_models, verbosity, db, **kwargs):
         sequence_sql = connections[db].ops.sequence_reset_sql(no_style(), [Site])
         if sequence_sql:
             if verbosity >= 2:
-                print "Resetting sequence"
+                print("Resetting sequence")
             cursor = connections[db].cursor()
             for command in sequence_sql:
                 cursor.execute(command)

+ 2 - 2
django/core/management/__init__.py

@@ -299,7 +299,7 @@ class ManagementUtility(object):
 
         # subcommand
         if cword == 1:
-            print ' '.join(sorted(filter(lambda x: x.startswith(curr), subcommands)))
+            print(' '.join(sorted(filter(lambda x: x.startswith(curr), subcommands))))
         # subcommand options
         # special case: the 'help' subcommand has no options
         elif cwords[0] in subcommands and cwords[0] != 'help':
@@ -333,7 +333,7 @@ class ManagementUtility(object):
                 # append '=' to options which require args
                 if option[1]:
                     opt_label += '='
-                print opt_label
+                print(opt_label)
         sys.exit(1)
 
     def execute(self):

+ 1 - 1
django/core/management/sql.py

@@ -173,7 +173,7 @@ def emit_post_sync_signal(created_models, verbosity, interactive, db):
     for app in models.get_apps():
         app_name = app.__name__.split('.')[-2]
         if verbosity >= 2:
-            print "Running post-sync handlers for application", app_name
+            print("Running post-sync handlers for application %s" % app_name)
         models.signals.post_syncdb.send(sender=app, app=app,
             created_models=created_models, verbosity=verbosity,
             interactive=interactive, db=db)

+ 8 - 8
django/core/servers/fastcgi.py

@@ -82,9 +82,9 @@ Examples:
 """ % FASTCGI_OPTIONS
 
 def fastcgi_help(message=None):
-    print FASTCGI_HELP
+    print(FASTCGI_HELP)
     if message:
-        print message
+        print(message)
     return False
 
 def runfastcgi(argset=[], **kwargs):
@@ -103,11 +103,11 @@ def runfastcgi(argset=[], **kwargs):
     try:
         import flup
     except ImportError as e:
-        print >> sys.stderr, "ERROR: %s" % e
-        print >> sys.stderr, "  Unable to load the flup package.  In order to run django"
-        print >> sys.stderr, "  as a FastCGI application, you will need to get flup from"
-        print >> sys.stderr, "  http://www.saddi.com/software/flup/   If you've already"
-        print >> sys.stderr, "  installed flup, then make sure you have it in your PYTHONPATH."
+        sys.stderr.write("ERROR: %s\n" % e)
+        sys.stderr.write("  Unable to load the flup package.  In order to run django\n")
+        sys.stderr.write("  as a FastCGI application, you will need to get flup from\n")
+        sys.stderr.write("  http://www.saddi.com/software/flup/   If you've already\n")
+        sys.stderr.write("  installed flup, then make sure you have it in your PYTHONPATH.\n")
         return False
 
     flup_module = 'server.' + options['protocol']
@@ -136,7 +136,7 @@ def runfastcgi(argset=[], **kwargs):
         module = importlib.import_module('.%s' % flup_module, 'flup')
         WSGIServer = module.WSGIServer
     except Exception:
-        print "Can't import flup." + flup_module
+        print("Can't import flup." + flup_module)
         return False
 
     # Prep up and go

+ 7 - 7
django/db/backends/creation.py

@@ -256,8 +256,8 @@ class BaseDatabaseCreation(object):
             test_db_repr = ''
             if verbosity >= 2:
                 test_db_repr = " ('%s')" % test_database_name
-            print "Creating test database for alias '%s'%s..." % (
-                self.connection.alias, test_db_repr)
+            print("Creating test database for alias '%s'%s..." % (
+                self.connection.alias, test_db_repr))
 
         self._create_test_db(verbosity, autoclobber)
 
@@ -339,8 +339,8 @@ class BaseDatabaseCreation(object):
             if autoclobber or confirm == 'yes':
                 try:
                     if verbosity >= 1:
-                        print ("Destroying old test database '%s'..."
-                               % self.connection.alias)
+                        print("Destroying old test database '%s'..."
+                              % self.connection.alias)
                     cursor.execute(
                         "DROP DATABASE %s" % qn(test_database_name))
                     cursor.execute(
@@ -351,7 +351,7 @@ class BaseDatabaseCreation(object):
                         "Got an error recreating the test database: %s\n" % e)
                     sys.exit(2)
             else:
-                print "Tests cancelled."
+                print("Tests cancelled.")
                 sys.exit(1)
 
         return test_database_name
@@ -367,8 +367,8 @@ class BaseDatabaseCreation(object):
             test_db_repr = ''
             if verbosity >= 2:
                 test_db_repr = " ('%s')" % test_database_name
-            print "Destroying test database for alias '%s'%s..." % (
-                self.connection.alias, test_db_repr)
+            print("Destroying test database for alias '%s'%s..." % (
+                self.connection.alias, test_db_repr))
 
         # Temporarily use a new connection and a copy of the settings dict.
         # This prevents the production database from being exposed to potential

+ 14 - 14
django/db/backends/oracle/creation.py

@@ -69,19 +69,19 @@ class DatabaseCreation(BaseDatabaseCreation):
                 if autoclobber or confirm == 'yes':
                     try:
                         if verbosity >= 1:
-                            print "Destroying old test database '%s'..." % self.connection.alias
+                            print("Destroying old test database '%s'..." % self.connection.alias)
                         self._execute_test_db_destruction(cursor, parameters, verbosity)
                         self._execute_test_db_creation(cursor, parameters, verbosity)
                     except Exception as e:
                         sys.stderr.write("Got an error recreating the test database: %s\n" % e)
                         sys.exit(2)
                 else:
-                    print "Tests cancelled."
+                    print("Tests cancelled.")
                     sys.exit(1)
 
         if self._test_user_create():
             if verbosity >= 1:
-                print "Creating test user..."
+                print("Creating test user...")
             try:
                 self._create_test_user(cursor, parameters, verbosity)
             except Exception as e:
@@ -91,16 +91,16 @@ class DatabaseCreation(BaseDatabaseCreation):
                 if autoclobber or confirm == 'yes':
                     try:
                         if verbosity >= 1:
-                            print "Destroying old test user..."
+                            print("Destroying old test user...")
                         self._destroy_test_user(cursor, parameters, verbosity)
                         if verbosity >= 1:
-                            print "Creating test user..."
+                            print("Creating test user...")
                         self._create_test_user(cursor, parameters, verbosity)
                     except Exception as e:
                         sys.stderr.write("Got an error recreating the test user: %s\n" % e)
                         sys.exit(2)
                 else:
-                    print "Tests cancelled."
+                    print("Tests cancelled.")
                     sys.exit(1)
 
         self.connection.settings_dict['SAVED_USER'] = self.connection.settings_dict['USER']
@@ -136,17 +136,17 @@ class DatabaseCreation(BaseDatabaseCreation):
         time.sleep(1) # To avoid "database is being accessed by other users" errors.
         if self._test_user_create():
             if verbosity >= 1:
-                print 'Destroying test user...'
+                print('Destroying test user...')
             self._destroy_test_user(cursor, parameters, verbosity)
         if self._test_database_create():
             if verbosity >= 1:
-                print 'Destroying test database tables...'
+                print('Destroying test database tables...')
             self._execute_test_db_destruction(cursor, parameters, verbosity)
         self.connection.close()
 
     def _execute_test_db_creation(self, cursor, parameters, verbosity):
         if verbosity >= 2:
-            print "_create_test_db(): dbname = %s" % parameters['dbname']
+            print("_create_test_db(): dbname = %s" % parameters['dbname'])
         statements = [
             """CREATE TABLESPACE %(tblspace)s
                DATAFILE '%(tblspace)s.dbf' SIZE 20M
@@ -161,7 +161,7 @@ class DatabaseCreation(BaseDatabaseCreation):
 
     def _create_test_user(self, cursor, parameters, verbosity):
         if verbosity >= 2:
-            print "_create_test_user(): username = %s" % parameters['user']
+            print("_create_test_user(): username = %s" % parameters['user'])
         statements = [
             """CREATE USER %(user)s
                IDENTIFIED BY %(password)s
@@ -174,7 +174,7 @@ class DatabaseCreation(BaseDatabaseCreation):
 
     def _execute_test_db_destruction(self, cursor, parameters, verbosity):
         if verbosity >= 2:
-            print "_execute_test_db_destruction(): dbname=%s" % parameters['dbname']
+            print("_execute_test_db_destruction(): dbname=%s" % parameters['dbname'])
         statements = [
             'DROP TABLESPACE %(tblspace)s INCLUDING CONTENTS AND DATAFILES CASCADE CONSTRAINTS',
             'DROP TABLESPACE %(tblspace_temp)s INCLUDING CONTENTS AND DATAFILES CASCADE CONSTRAINTS',
@@ -183,8 +183,8 @@ class DatabaseCreation(BaseDatabaseCreation):
 
     def _destroy_test_user(self, cursor, parameters, verbosity):
         if verbosity >= 2:
-            print "_destroy_test_user(): user=%s" % parameters['user']
-            print "Be patient.  This can take some time..."
+            print("_destroy_test_user(): user=%s" % parameters['user'])
+            print("Be patient.  This can take some time...")
         statements = [
             'DROP USER %(user)s CASCADE',
         ]
@@ -194,7 +194,7 @@ class DatabaseCreation(BaseDatabaseCreation):
         for template in statements:
             stmt = template % parameters
             if verbosity >= 2:
-                print stmt
+                print(stmt)
             try:
                 cursor.execute(stmt)
             except Exception as err:

+ 2 - 2
django/db/backends/sqlite3/creation.py

@@ -50,7 +50,7 @@ class DatabaseCreation(BaseDatabaseCreation):
         if test_database_name != ':memory:':
             # Erase the old test database
             if verbosity >= 1:
-                print "Destroying old test database '%s'..." % self.connection.alias
+                print("Destroying old test database '%s'..." % self.connection.alias)
             if os.access(test_database_name, os.F_OK):
                 if not autoclobber:
                     confirm = raw_input("Type 'yes' if you would like to try deleting the test database '%s', or 'no' to cancel: " % test_database_name)
@@ -61,7 +61,7 @@ class DatabaseCreation(BaseDatabaseCreation):
                       sys.stderr.write("Got an error deleting the old test database: %s\n" % e)
                       sys.exit(2)
                 else:
-                    print "Tests cancelled."
+                    print("Tests cancelled.")
                     sys.exit(1)
         return test_database_name
 

+ 3 - 3
django/dispatch/saferef.py

@@ -122,9 +122,9 @@ class BoundMethodWeakref(object):
                 except Exception as e:
                     try:
                         traceback.print_exc()
-                    except AttributeError as err:
-                        print '''Exception during saferef %s cleanup function %s: %s'''%(
-                            self, function, e
+                    except AttributeError:
+                        print('Exception during saferef %s cleanup function %s: %s' % (
+                            self, function, e)
                         )
         self.deletionMethods = [onDelete]
         self.key = self.calculateKey( target )

+ 24 - 24
django/test/_doctest.py

@@ -878,7 +878,7 @@ class DocTestFinder:
         add them to `tests`.
         """
         if self._verbose:
-            print 'Finding tests in %s' % name
+            print('Finding tests in %s' % name)
 
         # If we've already processed this object, then ignore it.
         if id(obj) in seen:
@@ -1034,7 +1034,7 @@ class DocTestRunner:
         >>> tests = DocTestFinder().find(_TestClass)
         >>> runner = DocTestRunner(verbose=False)
         >>> for test in tests:
-        ...     print runner.run(test)
+        ...     print(runner.run(test))
         (0, 2)
         (0, 1)
         (0, 2)
@@ -1406,28 +1406,28 @@ class DocTestRunner:
                 failed.append(x)
         if verbose:
             if notests:
-                print len(notests), "items had no tests:"
+                print("%d items had no tests:" % len(notests))
                 notests.sort()
                 for thing in notests:
-                    print "   ", thing
+                    print("    %s" % thing)
             if passed:
-                print len(passed), "items passed all tests:"
+                print("%d items passed all tests:" % len(passed))
                 passed.sort()
                 for thing, count in passed:
-                    print " %3d tests in %s" % (count, thing)
+                    print(" %3d tests in %s" % (count, thing))
         if failed:
-            print self.DIVIDER
-            print len(failed), "items had failures:"
+            print(self.DIVIDER)
+            print("%d items had failures:" % len(failed))
             failed.sort()
             for thing, (f, t) in failed:
-                print " %3d of %3d in %s" % (f, t, thing)
+                print(" %3d of %3d in %s" % (f, t, thing))
         if verbose:
-            print totalt, "tests in", len(self._name2ft), "items."
-            print totalt - totalf, "passed and", totalf, "failed."
+            print("%d tests in % d items" % (len(self._name2ft), totalt))
+            print("%d passed and %d failed." % (totalt - totalf,  totalf))
         if totalf:
-            print "***Test Failed***", totalf, "failures."
+            print("***Test Failed*** %d failures." % totalf)
         elif verbose:
-            print "Test passed."
+            print("Test passed.")
         return totalf, totalt
 
     #/////////////////////////////////////////////////////////////////
@@ -1437,8 +1437,8 @@ class DocTestRunner:
         d = self._name2ft
         for name, (f, t) in other._name2ft.items():
             if name in d:
-                print "*** DocTestRunner.merge: '" + name + "' in both" \
-                    " testers; summing outcomes."
+                print("*** DocTestRunner.merge: '" + name + "' in both" \
+                    " testers; summing outcomes.")
                 f2, t2 = d[name]
                 f = f + f2
                 t = t + t2
@@ -2007,10 +2007,10 @@ class Tester:
     def runstring(self, s, name):
         test = DocTestParser().get_doctest(s, self.globs, name, None, None)
         if self.verbose:
-            print "Running string", name
+            print("Running string %s" % name)
         (f,t) = self.testrunner.run(test)
         if self.verbose:
-            print f, "of", t, "examples failed in string", name
+            print("%s of %s examples failed in string %s" % (f, t, name))
         return (f,t)
 
     def rundoc(self, object, name=None, module=None):
@@ -2442,7 +2442,7 @@ def script_from_examples(s):
        ...           Ho hum
        ...           '''
 
-       >>> print script_from_examples(text)
+       >>> print(script_from_examples(text))
        # Here are examples of simple math.
        #
        #     Python has super accurate integer addition
@@ -2533,7 +2533,7 @@ def debug_script(src, pm=False, globs=None):
             try:
                 execfile(srcfilename, globs, globs)
             except:
-                print sys.exc_info()[1]
+                print(sys.exc_info()[1])
                 pdb.post_mortem(sys.exc_info()[2])
         else:
             # Note that %r is vital here.  '%s' instead can, e.g., cause
@@ -2575,7 +2575,7 @@ class _TestClass:
         """val -> _TestClass object with associated value val.
 
         >>> t = _TestClass(123)
-        >>> print t.get()
+        >>> print(t.get())
         123
         """
 
@@ -2595,7 +2595,7 @@ class _TestClass:
         """get() -> return TestClass's associated value.
 
         >>> x = _TestClass(-42)
-        >>> print x.get()
+        >>> print(x.get())
         -42
         """
 
@@ -2627,7 +2627,7 @@ __test__ = {"_TestClass": _TestClass,
 
             "blank lines": r"""
                 Blank lines can be marked with <BLANKLINE>:
-                    >>> print 'foo\n\nbar\n'
+                    >>> print('foo\n\nbar\n')
                     foo
                     <BLANKLINE>
                     bar
@@ -2637,14 +2637,14 @@ __test__ = {"_TestClass": _TestClass,
             "ellipsis": r"""
                 If the ellipsis flag is used, then '...' can be used to
                 elide substrings in the desired output:
-                    >>> print range(1000) #doctest: +ELLIPSIS
+                    >>> print(range(1000)) #doctest: +ELLIPSIS
                     [0, 1, 2, ..., 999]
             """,
 
             "whitespace normalization": r"""
                 If the whitespace normalization flag is used, then
                 differences in whitespace are ignored.
-                    >>> print range(30) #doctest: +NORMALIZE_WHITESPACE
+                    >>> print(range(30)) #doctest: +NORMALIZE_WHITESPACE
                     [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
                      15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
                      27, 28, 29]

+ 1 - 1
django/utils/dateformat.py

@@ -6,7 +6,7 @@ Usage:
 >>> import datetime
 >>> d = datetime.datetime.now()
 >>> df = DateFormat(d)
->>> print df.format('jS F Y H:i')
+>>> print(df.format('jS F Y H:i'))
 7th October 2003 11:39
 >>>
 """

+ 5 - 5
django/utils/termcolors.py

@@ -33,10 +33,10 @@ def colorize(text='', opts=(), **kwargs):
         colorize('hello', fg='red', bg='blue', opts=('blink',))
         colorize()
         colorize('goodbye', opts=('underscore',))
-        print colorize('first line', fg='red', opts=('noreset',))
-        print 'this should be red too'
-        print colorize('and so should this')
-        print 'this should not be red'
+        print(colorize('first line', fg='red', opts=('noreset',)))
+        print('this should be red too')
+        print(colorize('and so should this'))
+        print('this should not be red')
     """
     code_list = []
     if text == '' and len(opts) == 1 and opts[0] == 'reset':
@@ -59,7 +59,7 @@ def make_style(opts=(), **kwargs):
 
     Example:
         bold_red = make_style(opts=('bold',), fg='red')
-        print bold_red('hello')
+        print(bold_red('hello'))
         KEYWORD = make_style(fg='yellow')
         COMMENT = make_style(fg='blue', opts=('bold',))
     """

+ 2 - 2
django/utils/unittest/main.py

@@ -99,7 +99,7 @@ class TestProgram(object):
 
     def usageExit(self, msg=None):
         if msg:
-            print msg
+            print(msg)
         usage = {'progName': self.progName, 'catchbreak': '', 'failfast': '',
                  'buffer': ''}
         if self.failfast != False:
@@ -108,7 +108,7 @@ class TestProgram(object):
             usage['catchbreak'] = CATCHBREAK
         if self.buffer != False:
             usage['buffer'] = BUFFEROUTPUT
-        print self.USAGE % usage
+        print(self.USAGE % usage)
         sys.exit(2)
 
     def parseArgs(self, argv):

+ 3 - 3
docs/_ext/applyxrefs.py

@@ -77,12 +77,12 @@ def main(argv=None):
         target_found, lines = has_target(fn)
         if not target_found:
             if testing:
-                print '%s: %s' % (fn, lines[0]),
+                print('%s: %s' % (fn, lines[0]))
             else:
-                print "Adding xref to %s" % fn
+                print("Adding xref to %s" % fn)
                 process_file(fn, lines)
         else:
             print "Skipping %s: already has a xref" % fn
 
 if __name__ == '__main__':
-    sys.exit(main())
+    sys.exit(main())

+ 5 - 5
docs/_ext/literals_to_xrefs.py

@@ -136,10 +136,10 @@ def colorize(text='', opts=(), **kwargs):
         colorize('hello', fg='red', bg='blue', opts=('blink',))
         colorize()
         colorize('goodbye', opts=('underscore',))
-        print colorize('first line', fg='red', opts=('noreset',))
-        print 'this should be red too'
-        print colorize('and so should this')
-        print 'this should not be red'
+        print(colorize('first line', fg='red', opts=('noreset',)))
+        print('this should be red too')
+        print(colorize('and so should this'))
+        print('this should not be red')
     """
     color_names = ('black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white')
     foreground = dict([(color_names[x], '3%s' % x) for x in range(8)])
@@ -168,4 +168,4 @@ if __name__ == '__main__':
     try:
         fixliterals(sys.argv[1])
     except (KeyboardInterrupt, SystemExit):
-        print
+        print('')

+ 1 - 1
docs/howto/custom-model-fields.txt

@@ -55,7 +55,7 @@ We'd like to be able to do things like this in our models (we assume the
 ``hand`` attribute on the model is an instance of ``Hand``)::
 
     example = MyModel.objects.get(pk=1)
-    print example.hand.north
+    print(example.hand.north)
 
     new_hand = Hand(north, east, south, west)
     example.hand = new_hand

+ 1 - 1
docs/intro/install.txt

@@ -83,7 +83,7 @@ To verify that Django can be seen by Python, type ``python`` from your shell.
 Then at the Python prompt, try to import Django::
 
     >>> import django
-    >>> print django.get_version()
+    >>> print(django.get_version())
     1.4
 
 

+ 1 - 1
docs/ref/contrib/gis/db-api.txt

@@ -76,7 +76,7 @@ transform procedure::
     >>> z = Zipcode(code=78212, poly=poly_3084)
     >>> z.save()
     >>> from django.db import connection
-    >>> print connection.queries[-1]['sql'] # printing the last SQL statement executed (requires DEBUG=True)
+    >>> print(connection.queries[-1]['sql']) # printing the last SQL statement executed (requires DEBUG=True)
     INSERT INTO "geoapp_zipcode" ("code", "poly") VALUES (78212, ST_Transform(ST_GeomFromWKB('\\001 ... ', 3084), 4326))
 
 Thus, geometry parameters may be passed in using the ``GEOSGeometry`` object, WKT

+ 12 - 12
docs/ref/contrib/gis/gdal.txt

@@ -114,7 +114,7 @@ __ http://www.gdal.org/ogr/ogr_formats.html
    information about each layer in a :class:`DataSource`::
 
        >>> for layer in ds:
-       ...     print 'Layer "%s": %i %ss' % (layer.name, len(layer), layer.geom_type.name)
+       ...     print('Layer "%s": %i %ss' % (layer.name, len(layer), layer.geom_type.name))
        ...
        Layer "cities": 3 Points
 
@@ -200,7 +200,7 @@ __ http://www.gdal.org/ogr/ogr_formats.html
    Property that returns the :class:`SpatialReference` associated
    with this layer::
 
-       >>> print layer.srs
+       >>> print(layer.srs)
        GEOGCS["GCS_WGS_1984",
            DATUM["WGS_1984",
                SPHEROID["WGS_1984",6378137,298.257223563]],
@@ -220,9 +220,9 @@ __ http://www.gdal.org/ogr/ogr_formats.html
    other than ``None``, only features that intersect the filter will be
    returned when iterating over the layer::
 
-       >>> print layer.spatial_filter
+       >>> print(layer.spatial_filter)
        None
-       >>> print len(layer)
+       >>> print(len(layer))
        3
        >>> [feat.get('Name') for feat in layer]
        ['Pueblo', 'Lawrence', 'Houston']
@@ -814,7 +814,7 @@ systems and coordinate transformation::
        >>> gt1 = OGRGeomType(3)             # Using an integer for the type
        >>> gt2 = OGRGeomType('Polygon')     # Using a string
        >>> gt3 = OGRGeomType('POLYGON')     # It's case-insensitive
-       >>> print gt1 == 3, gt1 == 'Polygon' # Equivalence works w/non-OGRGeomType objects
+       >>> print(gt1 == 3, gt1 == 'Polygon') # Equivalence works w/non-OGRGeomType objects
        True True
 
    .. attribute:: name
@@ -927,19 +927,19 @@ Coordinate System Objects
 
        >>> wkt = 'GEOGCS["WGS 84", DATUM["WGS_1984, ... AUTHORITY["EPSG","4326"]]')
        >>> srs = SpatialReference(wkt) # could also use 'WGS84', or 4326
-       >>> print srs['GEOGCS']
+       >>> print(srs['GEOGCS'])
        WGS 84
-       >>> print srs['DATUM']
+       >>> print(srs['DATUM'])
        WGS_1984
-       >>> print srs['AUTHORITY']
+       >>> print(srs['AUTHORITY'])
        EPSG
-       >>> print srs['AUTHORITY', 1] # The authority value
+       >>> print(srs['AUTHORITY', 1]) # The authority value
        4326
-       >>> print srs['TOWGS84', 4] # the fourth value in this wkt
+       >>> print(srs['TOWGS84', 4]) # the fourth value in this wkt
        0
-       >>> print srs['UNIT|AUTHORITY'] # For the units authority, have to use the pipe symbol.
+       >>> print(srs['UNIT|AUTHORITY']) # For the units authority, have to use the pipe symbol.
        EPSG
-       >>> print srs['UNIT|AUTHORITY', 1] # The authority value for the units
+       >>> print(srs['UNIT|AUTHORITY', 1]) # The authority value for the units
        9122
 
    .. method:: attr_value(target, index=0)

+ 8 - 8
docs/ref/contrib/gis/geoquerysets.txt

@@ -714,7 +714,7 @@ the distance from the `Tasmanian`__ city of Hobart to every other
 :class:`PointField` in the ``AustraliaCity`` queryset is calculated::
 
     >>> pnt = AustraliaCity.objects.get(name='Hobart').point
-    >>> for city in AustraliaCity.objects.distance(pnt): print city.name, city.distance
+    >>> for city in AustraliaCity.objects.distance(pnt): print(city.name, city.distance)
     Wollongong 990071.220408 m
     Shellharbour 972804.613941 m
     Thirroul 1002334.36351 m
@@ -874,9 +874,9 @@ Example::
 
     >>> qs = Zipcode.objects.all().transform() # Transforms to WGS84
     >>> qs = Zipcode.objects.all().transform(32140) # Transforming to "NAD83 / Texas South Central"
-    >>> print qs[0].poly.srid
+    >>> print(qs[0].poly.srid)
     32140
-    >>> print qs[0].poly
+    >>> print(qs[0].poly)
     POLYGON ((234055.1698884720099159 4937796.9232223574072123 ...
 
 ``translate``
@@ -990,7 +990,7 @@ Attaches a ``gml`` attribute to every model in the queryset that contains the
 Example::
 
     >>> qs = Zipcode.objects.all().gml()
-    >>> print qs[0].gml
+    >>> print(qs[0].gml)
     <gml:Polygon srsName="EPSG:4326"><gml:OuterBoundaryIs>-147.78711,70.245363 ...  -147.78711,70.245363</gml:OuterBoundaryIs></gml:Polygon>
 
 =====================  =====================================================
@@ -1023,7 +1023,7 @@ necessary.
 Example::
 
     >>> qs = Zipcode.objects.all().kml()
-    >>> print qs[0].kml
+    >>> print(qs[0].kml)
     <Polygon><outerBoundaryIs><LinearRing><coordinates>-103.04135,36.217596,0 ... -103.04135,36.217596,0</coordinates></LinearRing></outerBoundaryIs></Polygon>
 
 =====================  =====================================================
@@ -1128,7 +1128,7 @@ lower left coordinate and the upper right coordinate.
 Example::
 
     >>> qs = City.objects.filter(name__in=('Houston', 'Dallas'))
-    >>> print qs.extent()
+    >>> print(qs.extent())
     (-96.8016128540039, 29.7633724212646, -95.3631439208984, 32.782058715820)
 
 ``extent3d``
@@ -1146,7 +1146,7 @@ the lower left coordinate and upper right coordinate.
 Example::
 
     >>> qs = City.objects.filter(name__in=('Houston', 'Dallas'))
-    >>> print qs.extent3d()
+    >>> print(qs.extent3d())
     (-96.8016128540039, 29.7633724212646, 0, -95.3631439208984, 32.782058715820, 0)
 
 ``make_line``
@@ -1161,7 +1161,7 @@ Returns a ``LineString`` constructed from the point field geometries in the
 
 Example::
 
-     >>> print City.objects.filter(name__in=('Houston', 'Dallas')).make_line()
+     >>> print(City.objects.filter(name__in=('Houston', 'Dallas')).make_line())
      LINESTRING (-95.3631510000000020 29.7633739999999989, -96.8016109999999941 32.7820570000000018)
 
 ``unionagg``

+ 1 - 1
docs/ref/contrib/gis/geos.txt

@@ -231,7 +231,7 @@ Property that may be used to retrieve or set the SRID associated with the
 geometry.  For example::
 
     >>> pnt = Point(5, 23)
-    >>> print pnt.srid
+    >>> print(pnt.srid)
     None
     >>> pnt.srid = 4326
     >>> pnt.srid

+ 4 - 4
docs/ref/contrib/gis/layermapping.txt

@@ -39,13 +39,13 @@ Example
     >>> from django.contrib.gis.gdal import DataSource
     >>> ds = DataSource('test_poly.shp')
     >>> layer = ds[0]
-    >>> print layer.fields # Exploring the fields in the layer, we only want the 'str' field.
+    >>> print(layer.fields) # Exploring the fields in the layer, we only want the 'str' field.
     ['float', 'int', 'str']
-    >>> print len(layer) # getting the number of features in the layer (should be 3)
+    >>> print(len(layer)) # getting the number of features in the layer (should be 3)
     3
-    >>> print layer.geom_type # Should be 'Polygon'
+    >>> print(layer.geom_type) # Should be 'Polygon'
     Polygon
-    >>> print layer.srs # WGS84 in WKT
+    >>> print(layer.srs) # WGS84 in WKT
     GEOGCS["GCS_WGS_1984",
         DATUM["WGS_1984",
             SPHEROID["WGS_1984",6378137,298.257223563]],

+ 11 - 11
docs/ref/contrib/gis/measure.txt

@@ -22,41 +22,41 @@ instantiated in units of kilometers (``km``) and miles (``mi``)::
 
     >>> from django.contrib.gis.measure import Distance, D
     >>> d1 = Distance(km=5)
-    >>> print d1
+    >>> print(d1)
     5.0 km
     >>> d2 = D(mi=5) # `D` is an alias for `Distance`
-    >>> print d2
+    >>> print(d2)
     5.0 mi
 
 Conversions are easy, just access the preferred unit attribute to get a
 converted distance quantity::
 
-    >>> print d1.mi # Converting 5 kilometers to miles
+    >>> print(d1.mi) # Converting 5 kilometers to miles
     3.10685596119
-    >>> print d2.km # Converting 5 miles to kilometers
+    >>> print(d2.km) # Converting 5 miles to kilometers
     8.04672
 
 Moreover, arithmetic operations may be performed between the distance
 objects::
 
-    >>> print d1 + d2 # Adding 5 miles to 5 kilometers
+    >>> print(d1 + d2) # Adding 5 miles to 5 kilometers
     13.04672 km
-    >>> print d2 - d1 # Subtracting 5 kilometers from 5 miles
+    >>> print(d2 - d1) # Subtracting 5 kilometers from 5 miles
     1.89314403881 mi
 
 Two :class:`Distance` objects multiplied together will yield an :class:`Area`
 object, which uses squared units of measure::
 
     >>> a = d1 * d2 # Returns an Area object.
-    >>> print a
+    >>> print(a)
     40.2336 sq_km
 
 To determine what the attribute abbreviation of a unit is, the ``unit_attname``
 class method may be used::
 
-    >>> print Distance.unit_attname('US Survey Foot')
+    >>> print(Distance.unit_attname('US Survey Foot'))
     survey_ft
-    >>> print Distance.unit_attname('centimeter')
+    >>> print(Distance.unit_attname('centimeter'))
     cm
 
 .. _supported_units:
@@ -127,7 +127,7 @@ Measurement API
    Returns the distance value in units corresponding to the given unit
    attribute.  For example::
 
-       >>> print dist.km
+       >>> print(dist.km)
        8.04672
 
    .. classmethod:: unit_attname(unit_name)
@@ -159,7 +159,7 @@ Measurement API
    Returns the area value in units corresponding to the given unit
    attribute.  For example::
 
-       >>> print a.sq_km
+       >>> print(a.sq_km)
        12.949940551680001
 
    .. classmethod:: unit_attname(unit_name)

+ 12 - 12
docs/ref/contrib/gis/tutorial.txt

@@ -362,24 +362,24 @@ Now, the world borders shapefile may be opened using GeoDjango's
 
     >>> from django.contrib.gis.gdal import DataSource
     >>> ds = DataSource(world_shp)
-    >>> print ds
+    >>> print(ds)
     / ... /geodjango/world/data/TM_WORLD_BORDERS-0.3.shp (ESRI Shapefile)
 
 Data source objects can have different layers of geospatial features; however,
 shapefiles are only allowed to have one layer::
 
-    >>> print len(ds)
+    >>> print(len(ds))
     1
     >>> lyr = ds[0]
-    >>> print lyr
+    >>> print(lyr)
     TM_WORLD_BORDERS-0.3
 
 You can see what the geometry type of the layer is and how many features it
 contains::
 
-    >>> print lyr.geom_type
+    >>> print(lyr.geom_type)
     Polygon
-    >>> print len(lyr)
+    >>> print(len(lyr))
     246
 
 .. note::
@@ -397,7 +397,7 @@ system associated with it -- if it does, the ``srs`` attribute will return a
 :class:`~django.contrib.gis.gdal.SpatialReference` object::
 
     >>> srs = lyr.srs
-    >>> print srs
+    >>> print(srs)
     GEOGCS["GCS_WGS_1984",
         DATUM["WGS_1984",
             SPHEROID["WGS_1984",6378137.0,298.257223563]],
@@ -413,7 +413,7 @@ latitude.
 In addition, shapefiles also support attribute fields that may contain
 additional data.  Here are the fields on the World Borders layer:
 
-    >>> print lyr.fields
+    >>> print(lyr.fields)
     ['FIPS', 'ISO2', 'ISO3', 'UN', 'NAME', 'AREA', 'POP2005', 'REGION', 'SUBREGION', 'LON', 'LAT']
 
 Here we are examining the OGR types (e.g., whether a field is an integer or
@@ -428,7 +428,7 @@ feature's attribute fields (whose **values** are accessed via ``get()``
 method)::
 
     >>> for feat in lyr:
-    ...    print feat.get('NAME'), feat.geom.num_points
+    ...    print(feat.get('NAME'), feat.geom.num_points)
     ...
     Guernsey 18
     Jersey 26
@@ -443,16 +443,16 @@ method)::
 And individual features may be retrieved by their feature ID::
 
     >>> feat = lyr[234]
-    >>> print feat.get('NAME')
+    >>> print(feat.get('NAME'))
     San Marino
 
 Here the boundary geometry for San Marino is extracted and looking
 exported to WKT and GeoJSON::
 
     >>> geom = feat.geom
-    >>> print geom.wkt
+    >>> print(geom.wkt)
     POLYGON ((12.415798 43.957954,12.450554 ...
-    >>> print geom.json
+    >>> print(geom.json)
     { "type": "Polygon", "coordinates": [ [ [ 12.415798, 43.957954 ], [ 12.450554, 43.979721 ], ...
 
 
@@ -659,7 +659,7 @@ in transformation SQL, allowing the developer to work at a higher level
 of abstraction::
 
     >>> qs = WorldBorder.objects.filter(mpoly__intersects=pnt)
-    >>> print qs.query # Generating the SQL
+    >>> print(qs.query) # Generating the SQL
     SELECT "world_worldborder"."id", "world_worldborder"."name", "world_worldborder"."area",
     "world_worldborder"."pop2005", "world_worldborder"."fips", "world_worldborder"."iso2",
     "world_worldborder"."iso3", "world_worldborder"."un", "world_worldborder"."region",

+ 1 - 1
docs/ref/contrib/syndication.txt

@@ -891,7 +891,7 @@ For example, to create an Atom 1.0 feed and print it to standard output::
     ...     link=u"http://www.example.com/entries/1/",
     ...     pubdate=datetime.now(),
     ...     description=u"<p>Today I had a Vienna Beef hot dog. It was pink, plump and perfect.</p>")
-    >>> print f.writeString('UTF-8')
+    >>> print(f.writeString('UTF-8'))
     <?xml version="1.0" encoding="UTF-8"?>
     <feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
     ...

+ 34 - 34
docs/ref/forms/api.txt

@@ -161,7 +161,7 @@ and the latter gets precedence::
     ...     url = forms.URLField()
     ...     comment = forms.CharField()
     >>> f = CommentForm(initial={'name': 'instance'}, auto_id=False)
-    >>> print f
+    >>> print(f)
     <tr><th>Name:</th><td><input type="text" name="name" value="instance" /></td></tr>
     <tr><th>Url:</th><td><input type="text" name="url" /></td></tr>
     <tr><th>Comment:</th><td><input type="text" name="comment" /></td></tr>
@@ -266,7 +266,7 @@ The second task of a ``Form`` object is to render itself as HTML. To do so,
 simply ``print`` it::
 
     >>> f = ContactForm()
-    >>> print f
+    >>> print(f)
     <tr><th><label for="id_subject">Subject:</label></th><td><input id="id_subject" type="text" name="subject" maxlength="100" /></td></tr>
     <tr><th><label for="id_message">Message:</label></th><td><input type="text" name="message" id="id_message" /></td></tr>
     <tr><th><label for="id_sender">Sender:</label></th><td><input type="text" name="sender" id="id_sender" /></td></tr>
@@ -283,7 +283,7 @@ include ``checked="checked"`` if appropriate::
     ...         'sender': 'foo@example.com',
     ...         'cc_myself': True}
     >>> f = ContactForm(data)
-    >>> print f
+    >>> print(f)
     <tr><th><label for="id_subject">Subject:</label></th><td><input id="id_subject" type="text" name="subject" maxlength="100" value="hello" /></td></tr>
     <tr><th><label for="id_message">Message:</label></th><td><input type="text" name="message" id="id_message" value="Hi there" /></td></tr>
     <tr><th><label for="id_sender">Sender:</label></th><td><input type="text" name="sender" id="id_sender" value="foo@example.com" /></td></tr>
@@ -331,7 +331,7 @@ a form object, and each rendering method returns a Unicode object.
         >>> f = ContactForm()
         >>> f.as_p()
         u'<p><label for="id_subject">Subject:</label> <input id="id_subject" type="text" name="subject" maxlength="100" /></p>\n<p><label for="id_message">Message:</label> <input type="text" name="message" id="id_message" /></p>\n<p><label for="id_sender">Sender:</label> <input type="text" name="sender" id="id_sender" /></p>\n<p><label for="id_cc_myself">Cc myself:</label> <input type="checkbox" name="cc_myself" id="id_cc_myself" /></p>'
-        >>> print f.as_p()
+        >>> print(f.as_p())
         <p><label for="id_subject">Subject:</label> <input id="id_subject" type="text" name="subject" maxlength="100" /></p>
         <p><label for="id_message">Message:</label> <input type="text" name="message" id="id_message" /></p>
         <p><label for="id_sender">Sender:</label> <input type="text" name="sender" id="id_sender" /></p>
@@ -350,7 +350,7 @@ a form object, and each rendering method returns a Unicode object.
         >>> f = ContactForm()
         >>> f.as_ul()
         u'<li><label for="id_subject">Subject:</label> <input id="id_subject" type="text" name="subject" maxlength="100" /></li>\n<li><label for="id_message">Message:</label> <input type="text" name="message" id="id_message" /></li>\n<li><label for="id_sender">Sender:</label> <input type="text" name="sender" id="id_sender" /></li>\n<li><label for="id_cc_myself">Cc myself:</label> <input type="checkbox" name="cc_myself" id="id_cc_myself" /></li>'
-        >>> print f.as_ul()
+        >>> print(f.as_ul())
         <li><label for="id_subject">Subject:</label> <input id="id_subject" type="text" name="subject" maxlength="100" /></li>
         <li><label for="id_message">Message:</label> <input type="text" name="message" id="id_message" /></li>
         <li><label for="id_sender">Sender:</label> <input type="text" name="sender" id="id_sender" /></li>
@@ -368,7 +368,7 @@ a form object, and each rendering method returns a Unicode object.
         >>> f = ContactForm()
         >>> f.as_table()
         u'<tr><th><label for="id_subject">Subject:</label></th><td><input id="id_subject" type="text" name="subject" maxlength="100" /></td></tr>\n<tr><th><label for="id_message">Message:</label></th><td><input type="text" name="message" id="id_message" /></td></tr>\n<tr><th><label for="id_sender">Sender:</label></th><td><input type="text" name="sender" id="id_sender" /></td></tr>\n<tr><th><label for="id_cc_myself">Cc myself:</label></th><td><input type="checkbox" name="cc_myself" id="id_cc_myself" /></td></tr>'
-        >>> print f.as_table()
+        >>> print(f.as_table())
         <tr><th><label for="id_subject">Subject:</label></th><td><input id="id_subject" type="text" name="subject" maxlength="100" /></td></tr>
         <tr><th><label for="id_message">Message:</label></th><td><input type="text" name="message" id="id_message" /></td></tr>
         <tr><th><label for="id_sender">Sender:</label></th><td><input type="text" name="sender" id="id_sender" /></td></tr>
@@ -398,7 +398,7 @@ Once you've done that, rows will be given ``"error"`` and/or ``"required"``
 classes, as needed. The HTML will look something like::
 
     >>> f = ContactForm(data)
-    >>> print f.as_table()
+    >>> print(f.as_table())
     <tr class="required"><th><label for="id_subject">Subject:</label>    ...
     <tr class="required"><th><label for="id_message">Message:</label>    ...
     <tr class="required error"><th><label for="id_sender">Sender:</label>      ...
@@ -426,17 +426,17 @@ If ``auto_id`` is ``False``, then the form output will not include ``<label>``
 tags nor ``id`` attributes::
 
     >>> f = ContactForm(auto_id=False)
-    >>> print f.as_table()
+    >>> print(f.as_table())
     <tr><th>Subject:</th><td><input type="text" name="subject" maxlength="100" /></td></tr>
     <tr><th>Message:</th><td><input type="text" name="message" /></td></tr>
     <tr><th>Sender:</th><td><input type="text" name="sender" /></td></tr>
     <tr><th>Cc myself:</th><td><input type="checkbox" name="cc_myself" /></td></tr>
-    >>> print f.as_ul()
+    >>> print(f.as_ul())
     <li>Subject: <input type="text" name="subject" maxlength="100" /></li>
     <li>Message: <input type="text" name="message" /></li>
     <li>Sender: <input type="text" name="sender" /></li>
     <li>Cc myself: <input type="checkbox" name="cc_myself" /></li>
-    >>> print f.as_p()
+    >>> print(f.as_p())
     <p>Subject: <input type="text" name="subject" maxlength="100" /></p>
     <p>Message: <input type="text" name="message" /></p>
     <p>Sender: <input type="text" name="sender" /></p>
@@ -447,17 +447,17 @@ If ``auto_id`` is set to ``True``, then the form output *will* include
 field::
 
     >>> f = ContactForm(auto_id=True)
-    >>> print f.as_table()
+    >>> print(f.as_table())
     <tr><th><label for="subject">Subject:</label></th><td><input id="subject" type="text" name="subject" maxlength="100" /></td></tr>
     <tr><th><label for="message">Message:</label></th><td><input type="text" name="message" id="message" /></td></tr>
     <tr><th><label for="sender">Sender:</label></th><td><input type="text" name="sender" id="sender" /></td></tr>
     <tr><th><label for="cc_myself">Cc myself:</label></th><td><input type="checkbox" name="cc_myself" id="cc_myself" /></td></tr>
-    >>> print f.as_ul()
+    >>> print(f.as_ul())
     <li><label for="subject">Subject:</label> <input id="subject" type="text" name="subject" maxlength="100" /></li>
     <li><label for="message">Message:</label> <input type="text" name="message" id="message" /></li>
     <li><label for="sender">Sender:</label> <input type="text" name="sender" id="sender" /></li>
     <li><label for="cc_myself">Cc myself:</label> <input type="checkbox" name="cc_myself" id="cc_myself" /></li>
-    >>> print f.as_p()
+    >>> print(f.as_p())
     <p><label for="subject">Subject:</label> <input id="subject" type="text" name="subject" maxlength="100" /></p>
     <p><label for="message">Message:</label> <input type="text" name="message" id="message" /></p>
     <p><label for="sender">Sender:</label> <input type="text" name="sender" id="sender" /></p>
@@ -470,17 +470,17 @@ attributes based on the format string. For example, for a format string
 ``'field_subject'``. Continuing our example::
 
     >>> f = ContactForm(auto_id='id_for_%s')
-    >>> print f.as_table()
+    >>> print(f.as_table())
     <tr><th><label for="id_for_subject">Subject:</label></th><td><input id="id_for_subject" type="text" name="subject" maxlength="100" /></td></tr>
     <tr><th><label for="id_for_message">Message:</label></th><td><input type="text" name="message" id="id_for_message" /></td></tr>
     <tr><th><label for="id_for_sender">Sender:</label></th><td><input type="text" name="sender" id="id_for_sender" /></td></tr>
     <tr><th><label for="id_for_cc_myself">Cc myself:</label></th><td><input type="checkbox" name="cc_myself" id="id_for_cc_myself" /></td></tr>
-    >>> print f.as_ul()
+    >>> print(f.as_ul())
     <li><label for="id_for_subject">Subject:</label> <input id="id_for_subject" type="text" name="subject" maxlength="100" /></li>
     <li><label for="id_for_message">Message:</label> <input type="text" name="message" id="id_for_message" /></li>
     <li><label for="id_for_sender">Sender:</label> <input type="text" name="sender" id="id_for_sender" /></li>
     <li><label for="id_for_cc_myself">Cc myself:</label> <input type="checkbox" name="cc_myself" id="id_for_cc_myself" /></li>
-    >>> print f.as_p()
+    >>> print(f.as_p())
     <p><label for="id_for_subject">Subject:</label> <input id="id_for_subject" type="text" name="subject" maxlength="100" /></p>
     <p><label for="id_for_message">Message:</label> <input type="text" name="message" id="id_for_message" /></p>
     <p><label for="id_for_sender">Sender:</label> <input type="text" name="sender" id="id_for_sender" /></p>
@@ -496,13 +496,13 @@ rendered. It's possible to change the colon to another character, or omit it
 entirely, using the ``label_suffix`` parameter::
 
     >>> f = ContactForm(auto_id='id_for_%s', label_suffix='')
-    >>> print f.as_ul()
+    >>> print(f.as_ul())
     <li><label for="id_for_subject">Subject</label> <input id="id_for_subject" type="text" name="subject" maxlength="100" /></li>
     <li><label for="id_for_message">Message</label> <input type="text" name="message" id="id_for_message" /></li>
     <li><label for="id_for_sender">Sender</label> <input type="text" name="sender" id="id_for_sender" /></li>
     <li><label for="id_for_cc_myself">Cc myself</label> <input type="checkbox" name="cc_myself" id="id_for_cc_myself" /></li>
     >>> f = ContactForm(auto_id='id_for_%s', label_suffix=' ->')
-    >>> print f.as_ul()
+    >>> print(f.as_ul())
     <li><label for="id_for_subject">Subject -></label> <input id="id_for_subject" type="text" name="subject" maxlength="100" /></li>
     <li><label for="id_for_message">Message -></label> <input type="text" name="message" id="id_for_message" /></li>
     <li><label for="id_for_sender">Sender -></label> <input type="text" name="sender" id="id_for_sender" /></li>
@@ -534,17 +534,17 @@ method you're using::
     ...         'sender': 'invalid email address',
     ...         'cc_myself': True}
     >>> f = ContactForm(data, auto_id=False)
-    >>> print f.as_table()
+    >>> print(f.as_table())
     <tr><th>Subject:</th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="text" name="subject" maxlength="100" /></td></tr>
     <tr><th>Message:</th><td><input type="text" name="message" value="Hi there" /></td></tr>
     <tr><th>Sender:</th><td><ul class="errorlist"><li>Enter a valid e-mail address.</li></ul><input type="text" name="sender" value="invalid email address" /></td></tr>
     <tr><th>Cc myself:</th><td><input checked="checked" type="checkbox" name="cc_myself" /></td></tr>
-    >>> print f.as_ul()
+    >>> print(f.as_ul())
     <li><ul class="errorlist"><li>This field is required.</li></ul>Subject: <input type="text" name="subject" maxlength="100" /></li>
     <li>Message: <input type="text" name="message" value="Hi there" /></li>
     <li><ul class="errorlist"><li>Enter a valid e-mail address.</li></ul>Sender: <input type="text" name="sender" value="invalid email address" /></li>
     <li>Cc myself: <input checked="checked" type="checkbox" name="cc_myself" /></li>
-    >>> print f.as_p()
+    >>> print(f.as_p())
     <p><ul class="errorlist"><li>This field is required.</li></ul></p>
     <p>Subject: <input type="text" name="subject" maxlength="100" /></p>
     <p>Message: <input type="text" name="message" value="Hi there" /></p>
@@ -593,13 +593,13 @@ To retrieve a single ``BoundField``, use dictionary lookup syntax on your form
 using the field's name as the key::
 
 	>>> form = ContactForm()
-	>>> print form['subject']
+	>>> print(form['subject'])
 	<input id="id_subject" type="text" name="subject" maxlength="100" />
 
 To retrieve all ``BoundField`` objects, iterate the form::
 
 	>>> form = ContactForm()
-	>>> for boundfield in form: print boundfield
+	>>> for boundfield in form: print(boundfield)
 	<input id="id_subject" type="text" name="subject" maxlength="100" />
 	<input type="text" name="message" id="id_message" />
 	<input type="text" name="sender" id="id_sender" />
@@ -608,10 +608,10 @@ To retrieve all ``BoundField`` objects, iterate the form::
 The field-specific output honors the form object's ``auto_id`` setting::
 
     >>> f = ContactForm(auto_id=False)
-    >>> print f['message']
+    >>> print(f['message'])
     <input type="text" name="message" />
     >>> f = ContactForm(auto_id='id_%s')
-    >>> print f['message']
+    >>> print(f['message'])
     <input type="text" name="message" id="id_message" />
 
 For a field's list of errors, access the field's ``errors`` attribute.
@@ -623,15 +623,15 @@ For a field's list of errors, access the field's ``errors`` attribute.
 
         >>> data = {'subject': 'hi', 'message': '', 'sender': '', 'cc_myself': ''}
         >>> f = ContactForm(data, auto_id=False)
-        >>> print f['message']
+        >>> print(f['message'])
         <input type="text" name="message" />
         >>> f['message'].errors
         [u'This field is required.']
-        >>> print f['message'].errors
+        >>> print(f['message'].errors)
         <ul class="errorlist"><li>This field is required.</li></ul>
         >>> f['subject'].errors
         []
-        >>> print f['subject'].errors
+        >>> print(f['subject'].errors)
 
         >>> str(f['subject'].errors)
 	    ''
@@ -667,9 +667,9 @@ by a ``Widget``::
     >>> initial = {'subject': 'welcome'}
     >>> unbound_form = ContactForm(initial=initial)
     >>> bound_form = ContactForm(data, initial=initial)
-    >>> print unbound_form['subject'].value()
+    >>> print(unbound_form['subject'].value())
     welcome
-    >>> print bound_form['subject'].value()
+    >>> print(bound_form['subject'].value())
     hi
 
 .. _binding-uploaded-files:
@@ -753,7 +753,7 @@ fields are ordered first::
     >>> class ContactFormWithPriority(ContactForm):
     ...     priority = forms.CharField()
     >>> f = ContactFormWithPriority(auto_id=False)
-    >>> print f.as_ul()
+    >>> print(f.as_ul())
     <li>Subject: <input type="text" name="subject" maxlength="100" /></li>
     <li>Message: <input type="text" name="message" /></li>
     <li>Sender: <input type="text" name="sender" /></li>
@@ -773,7 +773,7 @@ classes::
     >>> class BeatleForm(PersonForm, InstrumentForm):
     ...     haircut_type = CharField()
     >>> b = BeatleForm(auto_id=False)
-    >>> print b.as_ul()
+    >>> print(b.as_ul())
     <li>First name: <input type="text" name="first_name" /></li>
     <li>Last name: <input type="text" name="last_name" /></li>
     <li>Instrument: <input type="text" name="instrument" /></li>
@@ -791,9 +791,9 @@ You can put several Django forms inside one ``<form>`` tag. To give each
 
     >>> mother = PersonForm(prefix="mother")
     >>> father = PersonForm(prefix="father")
-    >>> print mother.as_ul()
+    >>> print(mother.as_ul())
     <li><label for="id_mother-first_name">First name:</label> <input type="text" name="mother-first_name" id="id_mother-first_name" /></li>
     <li><label for="id_mother-last_name">Last name:</label> <input type="text" name="mother-last_name" id="id_mother-last_name" /></li>
-    >>> print father.as_ul()
+    >>> print(father.as_ul())
     <li><label for="id_father-first_name">First name:</label> <input type="text" name="father-first_name" id="id_father-first_name" /></li>
     <li><label for="id_father-last_name">Last name:</label> <input type="text" name="father-last_name" id="id_father-last_name" /></li>

+ 7 - 7
docs/ref/forms/fields.txt

@@ -112,7 +112,7 @@ We've specified ``auto_id=False`` to simplify the output::
     ...     url = forms.URLField(label='Your Web site', required=False)
     ...     comment = forms.CharField()
     >>> f = CommentForm(auto_id=False)
-    >>> print f
+    >>> print(f)
     <tr><th>Your name:</th><td><input type="text" name="name" /></td></tr>
     <tr><th>Your Web site:</th><td><input type="text" name="url" /></td></tr>
     <tr><th>Comment:</th><td><input type="text" name="comment" /></td></tr>
@@ -135,7 +135,7 @@ field is initialized to a particular value. For example::
     ...     url = forms.URLField(initial='http://')
     ...     comment = forms.CharField()
     >>> f = CommentForm(auto_id=False)
-    >>> print f
+    >>> print(f)
     <tr><th>Name:</th><td><input type="text" name="name" value="Your name" /></td></tr>
     <tr><th>Url:</th><td><input type="text" name="url" value="http://" /></td></tr>
     <tr><th>Comment:</th><td><input type="text" name="comment" /></td></tr>
@@ -150,7 +150,7 @@ and the HTML output will include any validation errors::
     ...     comment = forms.CharField()
     >>> default_data = {'name': 'Your name', 'url': 'http://'}
     >>> f = CommentForm(default_data, auto_id=False)
-    >>> print f
+    >>> print(f)
     <tr><th>Name:</th><td><input type="text" name="name" value="Your name" /></td></tr>
     <tr><th>Url:</th><td><ul class="errorlist"><li>Enter a valid URL.</li></ul><input type="text" name="url" value="http://" /></td></tr>
     <tr><th>Comment:</th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="text" name="comment" /></td></tr>
@@ -179,7 +179,7 @@ Instead of a constant, you can also pass any callable::
     >>> import datetime
     >>> class DateForm(forms.Form):
     ...     day = forms.DateField(initial=datetime.date.today)
-    >>> print DateForm()
+    >>> print(DateForm())
     <tr><th>Day:</th><td><input type="text" name="day" value="12/23/2008" /><td></tr>
 
 The callable will be evaluated only when the unbound form is displayed, not when it is defined.
@@ -211,17 +211,17 @@ fields. We've specified ``auto_id=False`` to simplify the output::
     ...     sender = forms.EmailField(help_text='A valid email address, please.')
     ...     cc_myself = forms.BooleanField(required=False)
     >>> f = HelpTextContactForm(auto_id=False)
-    >>> print f.as_table()
+    >>> print(f.as_table())
     <tr><th>Subject:</th><td><input type="text" name="subject" maxlength="100" /><br /><span class="helptext">100 characters max.</span></td></tr>
     <tr><th>Message:</th><td><input type="text" name="message" /></td></tr>
     <tr><th>Sender:</th><td><input type="text" name="sender" /><br />A valid email address, please.</td></tr>
     <tr><th>Cc myself:</th><td><input type="checkbox" name="cc_myself" /></td></tr>
-    >>> print f.as_ul()
+    >>> print(f.as_ul()))
     <li>Subject: <input type="text" name="subject" maxlength="100" /> <span class="helptext">100 characters max.</span></li>
     <li>Message: <input type="text" name="message" /></li>
     <li>Sender: <input type="text" name="sender" /> A valid email address, please.</li>
     <li>Cc myself: <input type="checkbox" name="cc_myself" /></li>
-    >>> print f.as_p()
+    >>> print(f.as_p())
     <p>Subject: <input type="text" name="subject" maxlength="100" /> <span class="helptext">100 characters max.</span></p>
     <p>Message: <input type="text" name="message" /></p>
     <p>Sender: <input type="text" name="sender" /> A valid email address, please.</p>

+ 1 - 1
docs/ref/models/instances.txt

@@ -327,7 +327,7 @@ Once the object has been saved, you must reload the object in order to access
 the actual value that was applied to the updated field::
 
     >>> product = Products.objects.get(pk=product.pk)
-    >>> print product.number_sold
+    >>> print(product.number_sold)
     42
 
 For more details, see the documentation on :ref:`F() expressions

+ 3 - 3
docs/ref/models/querysets.txt

@@ -29,7 +29,7 @@ You can evaluate a ``QuerySet`` in the following ways:
   the headline of all entries in the database::
 
       for e in Entry.objects.all():
-          print e.headline
+          print(e.headline)
 
 * **Slicing.** As explained in :ref:`limiting-querysets`, a ``QuerySet`` can
   be sliced, using Python's array-slicing syntax. Slicing an unevaluated
@@ -71,7 +71,7 @@ You can evaluate a ``QuerySet`` in the following ways:
   ``True``, otherwise ``False``. For example::
 
       if Entry.objects.filter(headline="Test"):
-         print "There is at least one Entry with the headline Test"
+         print("There is at least one Entry with the headline Test")
 
   Note: *Don't* use this if all you want to do is determine if at least one
   result exists, and don't need the actual objects. It's more efficient to
@@ -1251,7 +1251,7 @@ The :exc:`~django.core.exceptions.DoesNotExist` exception inherits from
         e = Entry.objects.get(id=3)
         b = Blog.objects.get(id=1)
     except ObjectDoesNotExist:
-        print "Either the entry or blog doesn't exist."
+        print("Either the entry or blog doesn't exist.")
 
 create
 ~~~~~~

+ 3 - 3
docs/ref/template-response.txt

@@ -215,18 +215,18 @@ the content of the response manually::
     # Set up a rendered TemplateResponse
     >>> t = TemplateResponse(request, 'original.html', {})
     >>> t.render()
-    >>> print t.content
+    >>> print(t.content)
     Original content
 
     # Re-rendering doesn't change content
     >>> t.template_name = 'new.html'
     >>> t.render()
-    >>> print t.content
+    >>> print(t.content)
     Original content
 
     # Assigning content does change, no render() call required
     >>> t.content = t.rendered_content
-    >>> print t.content
+    >>> print(t.content)
     New content
 
 Post-render callbacks

+ 1 - 1
docs/ref/templates/api.txt

@@ -69,7 +69,7 @@ takes one argument -- the raw template code::
 
     >>> from django.template import Template
     >>> t = Template("My name is {{ my_name }}.")
-    >>> print t
+    >>> print(t)
     <django.template.Template instance>
 
 .. admonition:: Behind the scenes

+ 3 - 3
docs/topics/auth.txt

@@ -714,11 +714,11 @@ Django provides two functions in :mod:`django.contrib.auth`:
         user = authenticate(username='john', password='secret')
         if user is not None:
             if user.is_active:
-                print "You provided a correct username and password!"
+                print("You provided a correct username and password!")
             else:
-                print "Your account has been disabled!"
+                print("Your account has been disabled!")
         else:
-            print "Your username and password were incorrect."
+            print("Your username and password were incorrect.")
 
 .. function:: login()
 

+ 2 - 2
docs/topics/db/examples/many_to_many.txt

@@ -263,14 +263,14 @@ Bulk delete some Publications - references to deleted publications should go::
 Bulk delete some articles - references to deleted objects should go::
 
     >>> q = Article.objects.filter(headline__startswith='Django')
-    >>> print q
+    >>> print(q)
     [<Article: Django lets you build Web apps easily>]
     >>> q.delete()
 
 After the delete, the QuerySet cache needs to be cleared, and the referenced
 objects should be gone::
 
-    >>> print q
+    >>> print(q)
     []
     >>> p1.article_set.all()
     [<Article: NASA uses Python>]

+ 10 - 10
docs/topics/db/queries.txt

@@ -284,10 +284,10 @@ actually run the query until the :class:`~django.db.models.query.QuerySet` is
     >>> q = Entry.objects.filter(headline__startswith="What")
     >>> q = q.filter(pub_date__lte=datetime.now())
     >>> q = q.exclude(body_text__icontains="food")
-    >>> print q
+    >>> print(q)
 
 Though this looks like three database hits, in fact it hits the database only
-once, at the last line (``print q``). In general, the results of a
+once, at the last line (``print(q)``). In general, the results of a
 :class:`~django.db.models.query.QuerySet` aren't fetched from the database
 until you "ask" for them. When you do, the
 :class:`~django.db.models.query.QuerySet` is *evaluated* by accessing the
@@ -720,8 +720,8 @@ your :class:`~django.db.models.query.QuerySet`\s correctly. For example, the
 following will create two :class:`~django.db.models.query.QuerySet`\s, evaluate
 them, and throw them away::
 
-    >>> print [e.headline for e in Entry.objects.all()]
-    >>> print [e.pub_date for e in Entry.objects.all()]
+    >>> print([e.headline for e in Entry.objects.all()])
+    >>> print([e.pub_date for e in Entry.objects.all()])
 
 That means the same database query will be executed twice, effectively doubling
 your database load. Also, there's a possibility the two lists may not include
@@ -732,8 +732,8 @@ To avoid this problem, simply save the
 :class:`~django.db.models.query.QuerySet` and reuse it::
 
     >>> queryset = Entry.objects.all()
-    >>> print [p.headline for p in queryset] # Evaluate the query set.
-    >>> print [p.pub_date for p in queryset] # Re-use the cache from the evaluation.
+    >>> print([p.headline for p in queryset]) # Evaluate the query set.
+    >>> print([p.pub_date for p in queryset]) # Re-use the cache from the evaluation.
 
 .. _complex-lookups-with-q:
 
@@ -1055,16 +1055,16 @@ related object is accessed. Subsequent accesses to the foreign key on the same
 object instance are cached. Example::
 
     >>> e = Entry.objects.get(id=2)
-    >>> print e.blog  # Hits the database to retrieve the associated Blog.
-    >>> print e.blog  # Doesn't hit the database; uses cached version.
+    >>> print(e.blog)  # Hits the database to retrieve the associated Blog.
+    >>> print(e.blog)  # Doesn't hit the database; uses cached version.
 
 Note that the :meth:`~django.db.models.query.QuerySet.select_related`
 :class:`~django.db.models.query.QuerySet` method recursively prepopulates the
 cache of all one-to-many relationships ahead of time. Example::
 
     >>> e = Entry.objects.select_related().get(id=2)
-    >>> print e.blog  # Doesn't hit the database; uses cached version.
-    >>> print e.blog  # Doesn't hit the database; uses cached version.
+    >>> print(e.blog)  # Doesn't hit the database; uses cached version.
+    >>> print(e.blog)  # Doesn't hit the database; uses cached version.
 
 .. _backwards-related-objects:
 

+ 4 - 4
docs/topics/db/sql.txt

@@ -40,7 +40,7 @@ This is best illustrated with an example. Suppose you've got the following model
 You could then execute custom SQL like so::
 
     >>> for p in Person.objects.raw('SELECT * FROM myapp_person'):
-    ...     print p
+    ...     print(p)
     John Smith
     Jane Jones
 
@@ -128,8 +128,8 @@ The ``Person`` objects returned by this query will be deferred model instances
 fields that are omitted from the query will be loaded on demand. For example::
 
     >>> for p in Person.objects.raw('SELECT id, first_name FROM myapp_person'):
-    ...     print p.first_name, # This will be retrieved by the original query
-    ...     print p.last_name # This will be retrieved on demand
+    ...     print(p.first_name, # This will be retrieved by the original query
+    ...           p.last_name) # This will be retrieved on demand
     ...
     John Smith
     Jane Jones
@@ -153,7 +153,7 @@ of people with their ages calculated by the database::
 
     >>> people = Person.objects.raw('SELECT *, age(birth_date) AS age FROM myapp_person')
     >>> for p in people:
-    ...     print "%s is %s." % (p.first_name, p.age)
+    ...     print("%s is %s." % (p.first_name, p.age))
     John is 37.
     Jane is 42.
     ...

+ 8 - 8
docs/topics/forms/formsets.txt

@@ -24,7 +24,7 @@ would with a regular form::
 
     >>> formset = ArticleFormSet()
     >>> for form in formset:
-    ...     print form.as_table()
+    ...     print(form.as_table())
     <tr><th><label for="id_form-0-title">Title:</label></th><td><input type="text" name="form-0-title" id="id_form-0-title" /></td></tr>
     <tr><th><label for="id_form-0-pub_date">Pub date:</label></th><td><input type="text" name="form-0-pub_date" id="id_form-0-pub_date" /></td></tr>
 
@@ -42,7 +42,7 @@ the formset you iterated over the ``forms`` attribute::
 
     >>> formset = ArticleFormSet()
     >>> for form in formset.forms:
-    ...     print form.as_table()
+    ...     print(form.as_table())
 
 Iterating over ``formset.forms`` will render the forms in the order
 they were created. The default formset iterator also renders the forms
@@ -71,7 +71,7 @@ example::
     ... ])
 
     >>> for form in formset:
-    ...     print form.as_table()
+    ...     print(form.as_table())
     <tr><th><label for="id_form-0-title">Title:</label></th><td><input type="text" name="form-0-title" value="Django is now open source" id="id_form-0-title" /></td></tr>
     <tr><th><label for="id_form-0-pub_date">Pub date:</label></th><td><input type="text" name="form-0-pub_date" value="2008-05-12" id="id_form-0-pub_date" /></td></tr>
     <tr><th><label for="id_form-1-title">Title:</label></th><td><input type="text" name="form-1-title" id="id_form-1-title" /></td></tr>
@@ -98,7 +98,7 @@ limit the maximum number of empty forms the formset will display::
     >>> ArticleFormSet = formset_factory(ArticleForm, extra=2, max_num=1)
     >>> formset = ArticleFormset()
     >>> for form in formset:
-    ...     print form.as_table()
+    ...     print(form.as_table())
     <tr><th><label for="id_form-0-title">Title:</label></th><td><input type="text" name="form-0-title" id="id_form-0-title" /></td></tr>
     <tr><th><label for="id_form-0-pub_date">Pub date:</label></th><td><input type="text" name="form-0-pub_date" id="id_form-0-pub_date" /></td></tr>
 
@@ -283,7 +283,7 @@ Lets you create a formset with the ability to order::
     ...     {'title': u'Article #2', 'pub_date': datetime.date(2008, 5, 11)},
     ... ])
     >>> for form in formset:
-    ...     print form.as_table()
+    ...     print(form.as_table())
     <tr><th><label for="id_form-0-title">Title:</label></th><td><input type="text" name="form-0-title" value="Article #1" id="id_form-0-title" /></td></tr>
     <tr><th><label for="id_form-0-pub_date">Pub date:</label></th><td><input type="text" name="form-0-pub_date" value="2008-05-10" id="id_form-0-pub_date" /></td></tr>
     <tr><th><label for="id_form-0-ORDER">Order:</label></th><td><input type="text" name="form-0-ORDER" value="1" id="id_form-0-ORDER" /></td></tr>
@@ -321,7 +321,7 @@ happen when the user changes these values::
     >>> formset.is_valid()
     True
     >>> for form in formset.ordered_forms:
-    ...     print form.cleaned_data
+    ...     print(form.cleaned_data)
     {'pub_date': datetime.date(2008, 5, 1), 'ORDER': 0, 'title': u'Article #3'}
     {'pub_date': datetime.date(2008, 5, 11), 'ORDER': 1, 'title': u'Article #2'}
     {'pub_date': datetime.date(2008, 5, 10), 'ORDER': 2, 'title': u'Article #1'}
@@ -339,7 +339,7 @@ Lets you create a formset with the ability to delete::
     ...     {'title': u'Article #2', 'pub_date': datetime.date(2008, 5, 11)},
     ... ])
     >>> for form in formset:
-    ....    print form.as_table()
+    ....    print(form.as_table())
     <input type="hidden" name="form-TOTAL_FORMS" value="3" id="id_form-TOTAL_FORMS" /><input type="hidden" name="form-INITIAL_FORMS" value="2" id="id_form-INITIAL_FORMS" /><input type="hidden" name="form-MAX_NUM_FORMS" id="id_form-MAX_NUM_FORMS" />
     <tr><th><label for="id_form-0-title">Title:</label></th><td><input type="text" name="form-0-title" value="Article #1" id="id_form-0-title" /></td></tr>
     <tr><th><label for="id_form-0-pub_date">Pub date:</label></th><td><input type="text" name="form-0-pub_date" value="2008-05-10" id="id_form-0-pub_date" /></td></tr>
@@ -393,7 +393,7 @@ default fields/attributes of the order and deletion fields::
     >>> ArticleFormSet = formset_factory(ArticleForm, formset=BaseArticleFormSet)
     >>> formset = ArticleFormSet()
     >>> for form in formset:
-    ...     print form.as_table()
+    ...     print(form.as_table())
     <tr><th><label for="id_form-0-title">Title:</label></th><td><input type="text" name="form-0-title" id="id_form-0-title" /></td></tr>
     <tr><th><label for="id_form-0-pub_date">Pub date:</label></th><td><input type="text" name="form-0-pub_date" id="id_form-0-pub_date" /></td></tr>
     <tr><th><label for="id_form-0-my_field">My field:</label></th><td><input type="text" name="form-0-my_field" id="id_form-0-my_field" /></td></tr>

+ 8 - 8
docs/topics/forms/media.txt

@@ -64,7 +64,7 @@ named ``media``. The media for a CalendarWidget instance can be retrieved
 through this property::
 
     >>> w = CalendarWidget()
-    >>> print w.media
+    >>> print(w.media)
     <link href="http://media.example.com/pretty.css" type="text/css" media="all" rel="stylesheet" />
     <script type="text/javascript" src="http://media.example.com/animations.js"></script>
     <script type="text/javascript" src="http://media.example.com/actions.js"></script>
@@ -139,7 +139,7 @@ basic Calendar widget from the example above::
     ...         js = ('whizbang.js',)
 
     >>> w = FancyCalendarWidget()
-    >>> print w.media
+    >>> print(w.media)
     <link href="http://media.example.com/pretty.css" type="text/css" media="all" rel="stylesheet" />
     <link href="http://media.example.com/fancy.css" type="text/css" media="all" rel="stylesheet" />
     <script type="text/javascript" src="http://media.example.com/animations.js"></script>
@@ -159,7 +159,7 @@ declaration to the media declaration::
     ...         js = ('whizbang.js',)
 
     >>> w = FancyCalendarWidget()
-    >>> print w.media
+    >>> print(w.media)
     <link href="http://media.example.com/fancy.css" type="text/css" media="all" rel="stylesheet" />
     <script type="text/javascript" src="http://media.example.com/whizbang.js"></script>
 
@@ -221,7 +221,7 @@ was ``None``::
     ...         js = ('animations.js', 'http://othersite.com/actions.js')
 
     >>> w = CalendarWidget()
-    >>> print w.media
+    >>> print(w.media)
     <link href="/css/pretty.css" type="text/css" media="all" rel="stylesheet" />
     <script type="text/javascript" src="http://uploads.example.com/animations.js"></script>
     <script type="text/javascript" src="http://othersite.com/actions.js"></script>
@@ -229,7 +229,7 @@ was ``None``::
 But if :setting:`STATIC_URL` is ``'http://static.example.com/'``::
 
     >>> w = CalendarWidget()
-    >>> print w.media
+    >>> print(w.media)
     <link href="/css/pretty.css" type="text/css" media="all" rel="stylesheet" />
     <script type="text/javascript" src="http://static.example.com/animations.js"></script>
     <script type="text/javascript" src="http://othersite.com/actions.js"></script>
@@ -252,12 +252,12 @@ If you only want media of a particular type, you can use the subscript operator
 to filter out a medium of interest. For example::
 
     >>> w = CalendarWidget()
-    >>> print w.media
+    >>> print(w.media)
     <link href="http://media.example.com/pretty.css" type="text/css" media="all" rel="stylesheet" />
     <script type="text/javascript" src="http://media.example.com/animations.js"></script>
     <script type="text/javascript" src="http://media.example.com/actions.js"></script>
 
-    >>> print w.media['css']
+    >>> print(w.media)['css']
     <link href="http://media.example.com/pretty.css" type="text/css" media="all" rel="stylesheet" />
 
 When you use the subscript operator, the value that is returned is a new
@@ -282,7 +282,7 @@ the resulting Media object contains the union of the media from both files::
 
     >>> w1 = CalendarWidget()
     >>> w2 = OtherWidget()
-    >>> print w1.media + w2.media
+    >>> print(w1.media + w2.media)
     <link href="http://media.example.com/pretty.css" type="text/css" media="all" rel="stylesheet" />
     <script type="text/javascript" src="http://media.example.com/animations.js"></script>
     <script type="text/javascript" src="http://media.example.com/actions.js"></script>

+ 2 - 2
docs/topics/forms/modelforms.txt

@@ -556,7 +556,7 @@ This will create a formset that is capable of working with the data associated
 with the ``Author`` model. It works just like a regular formset::
 
     >>> formset = AuthorFormSet()
-    >>> print formset
+    >>> print(formset)
     <input type="hidden" name="form-TOTAL_FORMS" value="1" id="id_form-TOTAL_FORMS" /><input type="hidden" name="form-INITIAL_FORMS" value="0" id="id_form-INITIAL_FORMS" /><input type="hidden" name="form-MAX_NUM_FORMS" id="id_form-MAX_NUM_FORMS" />
     <tr><th><label for="id_form-0-name">Name:</label></th><td><input id="id_form-0-name" type="text" name="form-0-name" maxlength="100" /></td></tr>
     <tr><th><label for="id_form-0-title">Title:</label></th><td><select name="form-0-title" id="id_form-0-title">
@@ -692,7 +692,7 @@ so long as the total number of forms does not exceed ``max_num``::
     >>> AuthorFormSet = modelformset_factory(Author, max_num=4, extra=2)
     >>> formset = AuthorFormSet(queryset=Author.objects.order_by('name'))
     >>> for form in formset:
-    ...     print form.as_table()
+    ...     print(form.as_table())
     <tr><th><label for="id_form-0-name">Name:</label></th><td><input id="id_form-0-name" type="text" name="form-0-name" value="Charles Baudelaire" maxlength="100" /><input type="hidden" name="form-0-id" value="1" id="id_form-0-id" /></td></tr>
     <tr><th><label for="id_form-1-name">Name:</label></th><td><input id="id_form-1-name" type="text" name="form-1-name" value="Paul Verlaine" maxlength="100" /><input type="hidden" name="form-1-id" value="3" id="id_form-1-id" /></td></tr>
     <tr><th><label for="id_form-2-name">Name:</label></th><td><input id="id_form-2-name" type="text" name="form-2-name" value="Walt Whitman" maxlength="100" /><input type="hidden" name="form-2-id" value="2" id="id_form-2-id" /></td></tr>

+ 1 - 1
docs/topics/http/urls.txt

@@ -964,7 +964,7 @@ information about the URL pattern that matches a URL::
     # Resolve a URL
     match = resolve('/some/path/')
     # Print the URL pattern that matches the URL
-    print match.url_name
+    print(match.url_name)
 
 A :class:`ResolverMatch` object can also be assigned to a triple::
 

+ 1 - 1
docs/topics/i18n/translation.txt

@@ -436,7 +436,7 @@ languages::
 
     >>> from django.utils.translation import get_language_info
     >>> li = get_language_info('de')
-    >>> print li['name'], li['name_local'], li['bidi']
+    >>> print(li['name'], li['name_local'], li['bidi'])
     German Deutsch False
 
 The ``name`` and ``name_local`` attributes of the dictionary contain the name of

+ 1 - 1
docs/topics/install.txt

@@ -172,7 +172,7 @@ This file should also be located in your ``site-packages`` directory.
 
     .. code-block:: bash
 
-        python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"
+        python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"
 
     (Note that this should be run from a shell prompt, not a Python interactive
     prompt.)

+ 2 - 2
docs/topics/signals.txt

@@ -83,7 +83,7 @@ function or method:
 .. code-block:: python
 
     def my_callback(sender, **kwargs):
-        print "Request finished!"
+        print("Request finished!")
 
 Notice that the function takes a ``sender`` argument, along with wildcard
 keyword arguments (``**kwargs``); all signal handlers must take these arguments.
@@ -125,7 +125,7 @@ receiver:
 
     @receiver(request_finished)
     def my_callback(sender, **kwargs):
-        print "Request finished!"
+        print("Request finished!")
 
 Now, our ``my_callback`` function will be called each time a request finishes.
 

+ 1 - 1
docs/topics/signing.txt

@@ -64,7 +64,7 @@ If the signature or value have been altered in any way, a
     >>> try:
     ...    original = signer.unsign(value)
     ... except signing.BadSignature:
-    ...    print "Tampering detected!"
+    ...    print("Tampering detected!")
 
 By default, the ``Signer`` class uses the :setting:`SECRET_KEY` setting to
 generate signatures. You can use a different secret by passing it to the

+ 16 - 16
extras/csrf_migration_helper.py

@@ -319,29 +319,29 @@ def main(pythonpaths):
         found = search_python_list(python_code, to_search)
 
         # Display:
-        print t.absolute_filename
+        print(t.absolute_filename)
         for r in t.relative_filenames:
-            print u"  AKA %s" % r
-        print u"  POST forms: %s" % num_post_forms
-        print u"  With token: %s" % (num_post_forms - len(form_lines_without_token))
+            print("  AKA %s" % r)
+        print("  POST forms: %s" % num_post_forms)
+        print("  With token: %s" % (num_post_forms - len(form_lines_without_token)))
         if form_lines_without_token:
-            print u"  Without token:"
+            print("  Without token:")
             for ln in form_lines_without_token:
-                print "%s:%d:" % (t.absolute_filename, ln)
-        print
-        print u"  Searching for:"
+                print("%s:%d:" % (t.absolute_filename, ln))
+        print('')
+        print("  Searching for:")
         for r in to_search:
-            print u"    " + r
-        print
-        print u"  Found:"
+            print("    " + r)
+        print('')
+        print("  Found:")
         if len(found) == 0:
-            print "    Nothing"
+            print("    Nothing")
         else:
             for fn, ln in found:
-                print "%s:%d:" % (fn, ln)
+                print("%s:%d:" % (fn, ln))
 
-        print
-        print "----"
+        print('')
+        print("----")
 
 
 parser = OptionParser(usage=USAGE)
@@ -356,7 +356,7 @@ if __name__ == '__main__':
     settings = getattr(options, 'settings', None)
     if settings is None:
         if os.environ.get("DJANGO_SETTINGS_MODULE", None) is None:
-            print "You need to set DJANGO_SETTINGS_MODULE or use the '--settings' parameter"
+            print("You need to set DJANGO_SETTINGS_MODULE or use the '--settings' parameter")
             sys.exit(1)
     else:
         os.environ["DJANGO_SETTINGS_MODULE"] = settings

+ 1 - 1
tests/regressiontests/admin_scripts/management/commands/app_command.py

@@ -7,5 +7,5 @@ class Command(AppCommand):
     args = '[appname ...]'
 
     def handle_app(self, app, **options):
-        print 'EXECUTE:AppCommand app=%s, options=%s' % (app, sorted(options.items()))
+        print('EXECUTE:AppCommand app=%s, options=%s' % (app, sorted(options.items())))
 

+ 1 - 1
tests/regressiontests/admin_scripts/management/commands/base_command.py

@@ -14,4 +14,4 @@ class Command(BaseCommand):
     args = '[labels ...]'
 
     def handle(self, *labels, **options):
-        print 'EXECUTE:BaseCommand labels=%s, options=%s' % (labels, sorted(options.items()))
+        print('EXECUTE:BaseCommand labels=%s, options=%s' % (labels, sorted(options.items())))

+ 1 - 1
tests/regressiontests/admin_scripts/management/commands/label_command.py

@@ -7,4 +7,4 @@ class Command(LabelCommand):
     args = '<label>'
 
     def handle_label(self, label, **options):
-        print 'EXECUTE:LabelCommand label=%s, options=%s' % (label, sorted(options.items()))
+        print('EXECUTE:LabelCommand label=%s, options=%s' % (label, sorted(options.items())))

+ 1 - 1
tests/regressiontests/admin_scripts/management/commands/noargs_command.py

@@ -7,4 +7,4 @@ class Command(NoArgsCommand):
 
 
     def handle_noargs(self, **options):
-        print 'EXECUTE:NoArgsCommand options=%s' % sorted(options.items())
+        print('EXECUTE:NoArgsCommand options=%s' % sorted(options.items()))

+ 1 - 1
tests/regressiontests/test_runner/tests.py

@@ -166,7 +166,7 @@ class CustomOptionsTestRunner(simple.DjangoTestSuiteRunner):
         self.option_c = option_c
 
     def run_tests(self, test_labels, extra_tests=None, **kwargs):
-        print "%s:%s:%s" % (self.option_a, self.option_b, self.option_c)
+        print("%s:%s:%s" % (self.option_a, self.option_b, self.option_c))
 
 
 class CustomTestRunnerOptionsTests(AdminScriptTestCase):

+ 18 - 18
tests/runtests.py

@@ -126,7 +126,7 @@ def setup(verbosity, test_labels):
         # this module and add it to the list to test.
         if not test_labels or module_name in test_labels_set:
             if verbosity >= 2:
-                print "Importing application %s" % module_name
+                print("Importing application %s" % module_name)
             mod = load_app(module_label)
             if mod:
                 if module_label not in settings.INSTALLED_APPS:
@@ -178,7 +178,7 @@ def bisect_tests(bisection_label, options, test_labels):
         from django.db.models.loading import get_apps
         test_labels = [app.__name__.split('.')[-2] for app in get_apps()]
 
-    print '***** Bisecting test suite:',' '.join(test_labels)
+    print('***** Bisecting test suite: %s' % ' '.join(test_labels))
 
     # Make sure the bisection point isn't in the test list
     # Also remove tests that need to be run in specific combinations
@@ -202,44 +202,44 @@ def bisect_tests(bisection_label, options, test_labels):
         midpoint = len(test_labels)/2
         test_labels_a = test_labels[:midpoint] + [bisection_label]
         test_labels_b = test_labels[midpoint:] + [bisection_label]
-        print '***** Pass %da: Running the first half of the test suite' % iteration
-        print '***** Test labels:',' '.join(test_labels_a)
+        print('***** Pass %da: Running the first half of the test suite' % iteration)
+        print('***** Test labels: %s' % ' '.join(test_labels_a))
         failures_a = subprocess.call(subprocess_args + test_labels_a)
 
-        print '***** Pass %db: Running the second half of the test suite' % iteration
-        print '***** Test labels:',' '.join(test_labels_b)
-        print
+        print('***** Pass %db: Running the second half of the test suite' % iteration)
+        print('***** Test labels: %s' % ' '.join(test_labels_b))
+        print('')
         failures_b = subprocess.call(subprocess_args + test_labels_b)
 
         if failures_a and not failures_b:
-            print "***** Problem found in first half. Bisecting again..."
+            print("***** Problem found in first half. Bisecting again...")
             iteration = iteration + 1
             test_labels = test_labels_a[:-1]
         elif failures_b and not failures_a:
-            print "***** Problem found in second half. Bisecting again..."
+            print("***** Problem found in second half. Bisecting again...")
             iteration = iteration + 1
             test_labels = test_labels_b[:-1]
         elif failures_a and failures_b:
-            print "***** Multiple sources of failure found"
+            print("***** Multiple sources of failure found")
             break
         else:
-            print "***** No source of failure found... try pair execution (--pair)"
+            print("***** No source of failure found... try pair execution (--pair)")
             break
 
     if len(test_labels) == 1:
-        print "***** Source of error:",test_labels[0]
+        print("***** Source of error: %s" % test_labels[0])
     teardown(state)
 
 def paired_tests(paired_test, options, test_labels):
     state = setup(int(options.verbosity), test_labels)
 
     if not test_labels:
-        print ""
+        print("")
         # Get the full list of test labels to use for bisection
         from django.db.models.loading import get_apps
         test_labels = [app.__name__.split('.')[-2] for app in get_apps()]
 
-    print '***** Trying paired execution'
+    print('***** Trying paired execution')
 
     # Make sure the constant member of the pair isn't in the test list
     # Also remove tests that need to be run in specific combinations
@@ -259,14 +259,14 @@ def paired_tests(paired_test, options, test_labels):
         subprocess_args.append('--noinput')
 
     for i, label in enumerate(test_labels):
-        print '***** %d of %d: Check test pairing with %s' % (
-            i+1, len(test_labels), label)
+        print('***** %d of %d: Check test pairing with %s' % (
+              i + 1, len(test_labels), label))
         failures = subprocess.call(subprocess_args + [label, paired_test])
         if failures:
-            print '***** Found problem pair with',label
+            print('***** Found problem pair with %s' % label)
             return
 
-    print '***** No problem pair found'
+    print('***** No problem pair found')
     teardown(state)
 
 if __name__ == "__main__":