| 
									
										
											  
											
												Merged revisions 59488-59511 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r59489 | christian.heimes | 2007-12-14 03:33:57 +0100 (Fri, 14 Dec 2007) | 1 line
  Silence a warning about an unsed variable in debug builds
........
  r59490 | christian.heimes | 2007-12-14 03:35:23 +0100 (Fri, 14 Dec 2007) | 2 lines
  Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
  I added also the feature that a @prop.getter decorator does not overwrite the doc string of the property if it was given as an argument to property().
........
  r59491 | raymond.hettinger | 2007-12-14 03:49:47 +0100 (Fri, 14 Dec 2007) | 1 line
  Cleaner method naming convention
........
  r59492 | christian.heimes | 2007-12-14 04:02:34 +0100 (Fri, 14 Dec 2007) | 1 line
  Fixed a warning in _codecs_iso2022.c and some non C89 conform // comments.
........
  r59493 | christian.heimes | 2007-12-14 05:38:13 +0100 (Fri, 14 Dec 2007) | 1 line
  Fixed warning in ssl module
........
  r59500 | raymond.hettinger | 2007-12-14 19:08:20 +0100 (Fri, 14 Dec 2007) | 1 line
  Add line spacing for readability
........
  r59501 | raymond.hettinger | 2007-12-14 19:12:21 +0100 (Fri, 14 Dec 2007) | 3 lines
  Update method names for named tuples.
........
  r59503 | georg.brandl | 2007-12-14 20:03:36 +0100 (Fri, 14 Dec 2007) | 3 lines
  Add a section about nested listcomps to the tutorial.
  Thanks to Ian Bruntlett and Robert Lehmann.
........
  r59504 | raymond.hettinger | 2007-12-14 20:19:59 +0100 (Fri, 14 Dec 2007) | 1 line
  Faster and simpler _replace() method
........
  r59505 | raymond.hettinger | 2007-12-14 22:51:50 +0100 (Fri, 14 Dec 2007) | 1 line
  Add usage note
........
  r59507 | andrew.kuchling | 2007-12-14 23:41:18 +0100 (Fri, 14 Dec 2007) | 1 line
  Remove warning about URL
........
  r59510 | andrew.kuchling | 2007-12-14 23:52:36 +0100 (Fri, 14 Dec 2007) | 1 line
  Bump the version number, and make a few small edits
........
  r59511 | christian.heimes | 2007-12-15 00:42:36 +0100 (Sat, 15 Dec 2007) | 2 lines
  Fixed bug #1628
  The detection now works on Unix with Makefile, Makefile with VPATH and on Windows.
........
											
										 
											2007-12-15 01:27:15 +00:00
										 |  |  | # Test case for property | 
					
						
							|  |  |  | # more tests are in test_descr | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-24 01:46:21 +00:00
										 |  |  | import sys | 
					
						
							| 
									
										
											  
											
												Merged revisions 59488-59511 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r59489 | christian.heimes | 2007-12-14 03:33:57 +0100 (Fri, 14 Dec 2007) | 1 line
  Silence a warning about an unsed variable in debug builds
........
  r59490 | christian.heimes | 2007-12-14 03:35:23 +0100 (Fri, 14 Dec 2007) | 2 lines
  Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
  I added also the feature that a @prop.getter decorator does not overwrite the doc string of the property if it was given as an argument to property().
........
  r59491 | raymond.hettinger | 2007-12-14 03:49:47 +0100 (Fri, 14 Dec 2007) | 1 line
  Cleaner method naming convention
........
  r59492 | christian.heimes | 2007-12-14 04:02:34 +0100 (Fri, 14 Dec 2007) | 1 line
  Fixed a warning in _codecs_iso2022.c and some non C89 conform // comments.
........
  r59493 | christian.heimes | 2007-12-14 05:38:13 +0100 (Fri, 14 Dec 2007) | 1 line
  Fixed warning in ssl module
........
  r59500 | raymond.hettinger | 2007-12-14 19:08:20 +0100 (Fri, 14 Dec 2007) | 1 line
  Add line spacing for readability
........
  r59501 | raymond.hettinger | 2007-12-14 19:12:21 +0100 (Fri, 14 Dec 2007) | 3 lines
  Update method names for named tuples.
........
  r59503 | georg.brandl | 2007-12-14 20:03:36 +0100 (Fri, 14 Dec 2007) | 3 lines
  Add a section about nested listcomps to the tutorial.
  Thanks to Ian Bruntlett and Robert Lehmann.
........
  r59504 | raymond.hettinger | 2007-12-14 20:19:59 +0100 (Fri, 14 Dec 2007) | 1 line
  Faster and simpler _replace() method
........
  r59505 | raymond.hettinger | 2007-12-14 22:51:50 +0100 (Fri, 14 Dec 2007) | 1 line
  Add usage note
........
  r59507 | andrew.kuchling | 2007-12-14 23:41:18 +0100 (Fri, 14 Dec 2007) | 1 line
  Remove warning about URL
........
  r59510 | andrew.kuchling | 2007-12-14 23:52:36 +0100 (Fri, 14 Dec 2007) | 1 line
  Bump the version number, and make a few small edits
........
  r59511 | christian.heimes | 2007-12-15 00:42:36 +0100 (Sat, 15 Dec 2007) | 2 lines
  Fixed bug #1628
  The detection now works on Unix with Makefile, Makefile with VPATH and on Windows.
........
											
										 
											2007-12-15 01:27:15 +00:00
										 |  |  | import unittest | 
					
						
							| 
									
										
										
										
											2018-02-13 12:28:33 +02:00
										 |  |  | from test import support | 
					
						
							| 
									
										
											  
											
												Merged revisions 59488-59511 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r59489 | christian.heimes | 2007-12-14 03:33:57 +0100 (Fri, 14 Dec 2007) | 1 line
  Silence a warning about an unsed variable in debug builds
........
  r59490 | christian.heimes | 2007-12-14 03:35:23 +0100 (Fri, 14 Dec 2007) | 2 lines
  Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
  I added also the feature that a @prop.getter decorator does not overwrite the doc string of the property if it was given as an argument to property().
........
  r59491 | raymond.hettinger | 2007-12-14 03:49:47 +0100 (Fri, 14 Dec 2007) | 1 line
  Cleaner method naming convention
........
  r59492 | christian.heimes | 2007-12-14 04:02:34 +0100 (Fri, 14 Dec 2007) | 1 line
  Fixed a warning in _codecs_iso2022.c and some non C89 conform // comments.
........
  r59493 | christian.heimes | 2007-12-14 05:38:13 +0100 (Fri, 14 Dec 2007) | 1 line
  Fixed warning in ssl module
........
  r59500 | raymond.hettinger | 2007-12-14 19:08:20 +0100 (Fri, 14 Dec 2007) | 1 line
  Add line spacing for readability
........
  r59501 | raymond.hettinger | 2007-12-14 19:12:21 +0100 (Fri, 14 Dec 2007) | 3 lines
  Update method names for named tuples.
........
  r59503 | georg.brandl | 2007-12-14 20:03:36 +0100 (Fri, 14 Dec 2007) | 3 lines
  Add a section about nested listcomps to the tutorial.
  Thanks to Ian Bruntlett and Robert Lehmann.
........
  r59504 | raymond.hettinger | 2007-12-14 20:19:59 +0100 (Fri, 14 Dec 2007) | 1 line
  Faster and simpler _replace() method
........
  r59505 | raymond.hettinger | 2007-12-14 22:51:50 +0100 (Fri, 14 Dec 2007) | 1 line
  Add usage note
........
  r59507 | andrew.kuchling | 2007-12-14 23:41:18 +0100 (Fri, 14 Dec 2007) | 1 line
  Remove warning about URL
........
  r59510 | andrew.kuchling | 2007-12-14 23:52:36 +0100 (Fri, 14 Dec 2007) | 1 line
  Bump the version number, and make a few small edits
........
  r59511 | christian.heimes | 2007-12-15 00:42:36 +0100 (Sat, 15 Dec 2007) | 2 lines
  Fixed bug #1628
  The detection now works on Unix with Makefile, Makefile with VPATH and on Windows.
........
											
										 
											2007-12-15 01:27:15 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | class PropertyBase(Exception): | 
					
						
							|  |  |  |     pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class PropertyGet(PropertyBase): | 
					
						
							|  |  |  |     pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class PropertySet(PropertyBase): | 
					
						
							|  |  |  |     pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class PropertyDel(PropertyBase): | 
					
						
							|  |  |  |     pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class BaseClass(object): | 
					
						
							|  |  |  |     def __init__(self): | 
					
						
							|  |  |  |         self._spam = 5 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @property | 
					
						
							|  |  |  |     def spam(self): | 
					
						
							|  |  |  |         """BaseClass.getter""" | 
					
						
							|  |  |  |         return self._spam | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @spam.setter | 
					
						
							|  |  |  |     def spam(self, value): | 
					
						
							|  |  |  |         self._spam = value | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @spam.deleter | 
					
						
							|  |  |  |     def spam(self): | 
					
						
							|  |  |  |         del self._spam | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class SubClass(BaseClass): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @BaseClass.spam.getter | 
					
						
							|  |  |  |     def spam(self): | 
					
						
							|  |  |  |         """SubClass.getter""" | 
					
						
							|  |  |  |         raise PropertyGet(self._spam) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @spam.setter | 
					
						
							|  |  |  |     def spam(self, value): | 
					
						
							|  |  |  |         raise PropertySet(self._spam) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @spam.deleter | 
					
						
							|  |  |  |     def spam(self): | 
					
						
							|  |  |  |         raise PropertyDel(self._spam) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class PropertyDocBase(object): | 
					
						
							|  |  |  |     _spam = 1 | 
					
						
							|  |  |  |     def _get_spam(self): | 
					
						
							|  |  |  |         return self._spam | 
					
						
							|  |  |  |     spam = property(_get_spam, doc="spam spam spam") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class PropertyDocSub(PropertyDocBase): | 
					
						
							|  |  |  |     @PropertyDocBase.spam.getter | 
					
						
							|  |  |  |     def spam(self): | 
					
						
							|  |  |  |         """The decorator does not use this doc string""" | 
					
						
							|  |  |  |         return self._spam | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-04 22:59:07 +00:00
										 |  |  | class PropertySubNewGetter(BaseClass): | 
					
						
							|  |  |  |     @BaseClass.spam.getter | 
					
						
							|  |  |  |     def spam(self): | 
					
						
							|  |  |  |         """new docstring""" | 
					
						
							|  |  |  |         return 5 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class PropertyNewGetter(object): | 
					
						
							|  |  |  |     @property | 
					
						
							|  |  |  |     def spam(self): | 
					
						
							|  |  |  |         """original docstring""" | 
					
						
							|  |  |  |         return 1 | 
					
						
							|  |  |  |     @spam.getter | 
					
						
							|  |  |  |     def spam(self): | 
					
						
							|  |  |  |         """new docstring""" | 
					
						
							|  |  |  |         return 8 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
											  
											
												Merged revisions 59488-59511 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r59489 | christian.heimes | 2007-12-14 03:33:57 +0100 (Fri, 14 Dec 2007) | 1 line
  Silence a warning about an unsed variable in debug builds
........
  r59490 | christian.heimes | 2007-12-14 03:35:23 +0100 (Fri, 14 Dec 2007) | 2 lines
  Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
  I added also the feature that a @prop.getter decorator does not overwrite the doc string of the property if it was given as an argument to property().
........
  r59491 | raymond.hettinger | 2007-12-14 03:49:47 +0100 (Fri, 14 Dec 2007) | 1 line
  Cleaner method naming convention
........
  r59492 | christian.heimes | 2007-12-14 04:02:34 +0100 (Fri, 14 Dec 2007) | 1 line
  Fixed a warning in _codecs_iso2022.c and some non C89 conform // comments.
........
  r59493 | christian.heimes | 2007-12-14 05:38:13 +0100 (Fri, 14 Dec 2007) | 1 line
  Fixed warning in ssl module
........
  r59500 | raymond.hettinger | 2007-12-14 19:08:20 +0100 (Fri, 14 Dec 2007) | 1 line
  Add line spacing for readability
........
  r59501 | raymond.hettinger | 2007-12-14 19:12:21 +0100 (Fri, 14 Dec 2007) | 3 lines
  Update method names for named tuples.
........
  r59503 | georg.brandl | 2007-12-14 20:03:36 +0100 (Fri, 14 Dec 2007) | 3 lines
  Add a section about nested listcomps to the tutorial.
  Thanks to Ian Bruntlett and Robert Lehmann.
........
  r59504 | raymond.hettinger | 2007-12-14 20:19:59 +0100 (Fri, 14 Dec 2007) | 1 line
  Faster and simpler _replace() method
........
  r59505 | raymond.hettinger | 2007-12-14 22:51:50 +0100 (Fri, 14 Dec 2007) | 1 line
  Add usage note
........
  r59507 | andrew.kuchling | 2007-12-14 23:41:18 +0100 (Fri, 14 Dec 2007) | 1 line
  Remove warning about URL
........
  r59510 | andrew.kuchling | 2007-12-14 23:52:36 +0100 (Fri, 14 Dec 2007) | 1 line
  Bump the version number, and make a few small edits
........
  r59511 | christian.heimes | 2007-12-15 00:42:36 +0100 (Sat, 15 Dec 2007) | 2 lines
  Fixed bug #1628
  The detection now works on Unix with Makefile, Makefile with VPATH and on Windows.
........
											
										 
											2007-12-15 01:27:15 +00:00
										 |  |  | class PropertyTests(unittest.TestCase): | 
					
						
							|  |  |  |     def test_property_decorator_baseclass(self): | 
					
						
							|  |  |  |         # see #1620 | 
					
						
							|  |  |  |         base = BaseClass() | 
					
						
							|  |  |  |         self.assertEqual(base.spam, 5) | 
					
						
							|  |  |  |         self.assertEqual(base._spam, 5) | 
					
						
							|  |  |  |         base.spam = 10 | 
					
						
							|  |  |  |         self.assertEqual(base.spam, 10) | 
					
						
							|  |  |  |         self.assertEqual(base._spam, 10) | 
					
						
							|  |  |  |         delattr(base, "spam") | 
					
						
							| 
									
										
										
										
											2009-06-30 23:06:06 +00:00
										 |  |  |         self.assertTrue(not hasattr(base, "spam")) | 
					
						
							|  |  |  |         self.assertTrue(not hasattr(base, "_spam")) | 
					
						
							| 
									
										
											  
											
												Merged revisions 59488-59511 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r59489 | christian.heimes | 2007-12-14 03:33:57 +0100 (Fri, 14 Dec 2007) | 1 line
  Silence a warning about an unsed variable in debug builds
........
  r59490 | christian.heimes | 2007-12-14 03:35:23 +0100 (Fri, 14 Dec 2007) | 2 lines
  Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
  I added also the feature that a @prop.getter decorator does not overwrite the doc string of the property if it was given as an argument to property().
........
  r59491 | raymond.hettinger | 2007-12-14 03:49:47 +0100 (Fri, 14 Dec 2007) | 1 line
  Cleaner method naming convention
........
  r59492 | christian.heimes | 2007-12-14 04:02:34 +0100 (Fri, 14 Dec 2007) | 1 line
  Fixed a warning in _codecs_iso2022.c and some non C89 conform // comments.
........
  r59493 | christian.heimes | 2007-12-14 05:38:13 +0100 (Fri, 14 Dec 2007) | 1 line
  Fixed warning in ssl module
........
  r59500 | raymond.hettinger | 2007-12-14 19:08:20 +0100 (Fri, 14 Dec 2007) | 1 line
  Add line spacing for readability
........
  r59501 | raymond.hettinger | 2007-12-14 19:12:21 +0100 (Fri, 14 Dec 2007) | 3 lines
  Update method names for named tuples.
........
  r59503 | georg.brandl | 2007-12-14 20:03:36 +0100 (Fri, 14 Dec 2007) | 3 lines
  Add a section about nested listcomps to the tutorial.
  Thanks to Ian Bruntlett and Robert Lehmann.
........
  r59504 | raymond.hettinger | 2007-12-14 20:19:59 +0100 (Fri, 14 Dec 2007) | 1 line
  Faster and simpler _replace() method
........
  r59505 | raymond.hettinger | 2007-12-14 22:51:50 +0100 (Fri, 14 Dec 2007) | 1 line
  Add usage note
........
  r59507 | andrew.kuchling | 2007-12-14 23:41:18 +0100 (Fri, 14 Dec 2007) | 1 line
  Remove warning about URL
........
  r59510 | andrew.kuchling | 2007-12-14 23:52:36 +0100 (Fri, 14 Dec 2007) | 1 line
  Bump the version number, and make a few small edits
........
  r59511 | christian.heimes | 2007-12-15 00:42:36 +0100 (Sat, 15 Dec 2007) | 2 lines
  Fixed bug #1628
  The detection now works on Unix with Makefile, Makefile with VPATH and on Windows.
........
											
										 
											2007-12-15 01:27:15 +00:00
										 |  |  |         base.spam = 20 | 
					
						
							|  |  |  |         self.assertEqual(base.spam, 20) | 
					
						
							|  |  |  |         self.assertEqual(base._spam, 20) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_property_decorator_subclass(self): | 
					
						
							|  |  |  |         # see #1620 | 
					
						
							|  |  |  |         sub = SubClass() | 
					
						
							|  |  |  |         self.assertRaises(PropertyGet, getattr, sub, "spam") | 
					
						
							|  |  |  |         self.assertRaises(PropertySet, setattr, sub, "spam", None) | 
					
						
							|  |  |  |         self.assertRaises(PropertyDel, delattr, sub, "spam") | 
					
						
							| 
									
										
										
										
											2010-02-24 01:46:21 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     @unittest.skipIf(sys.flags.optimize >= 2, | 
					
						
							|  |  |  |                      "Docstrings are omitted with -O2 and above") | 
					
						
							|  |  |  |     def test_property_decorator_subclass_doc(self): | 
					
						
							|  |  |  |         sub = SubClass() | 
					
						
							| 
									
										
											  
											
												Merged revisions 59488-59511 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r59489 | christian.heimes | 2007-12-14 03:33:57 +0100 (Fri, 14 Dec 2007) | 1 line
  Silence a warning about an unsed variable in debug builds
........
  r59490 | christian.heimes | 2007-12-14 03:35:23 +0100 (Fri, 14 Dec 2007) | 2 lines
  Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
  I added also the feature that a @prop.getter decorator does not overwrite the doc string of the property if it was given as an argument to property().
........
  r59491 | raymond.hettinger | 2007-12-14 03:49:47 +0100 (Fri, 14 Dec 2007) | 1 line
  Cleaner method naming convention
........
  r59492 | christian.heimes | 2007-12-14 04:02:34 +0100 (Fri, 14 Dec 2007) | 1 line
  Fixed a warning in _codecs_iso2022.c and some non C89 conform // comments.
........
  r59493 | christian.heimes | 2007-12-14 05:38:13 +0100 (Fri, 14 Dec 2007) | 1 line
  Fixed warning in ssl module
........
  r59500 | raymond.hettinger | 2007-12-14 19:08:20 +0100 (Fri, 14 Dec 2007) | 1 line
  Add line spacing for readability
........
  r59501 | raymond.hettinger | 2007-12-14 19:12:21 +0100 (Fri, 14 Dec 2007) | 3 lines
  Update method names for named tuples.
........
  r59503 | georg.brandl | 2007-12-14 20:03:36 +0100 (Fri, 14 Dec 2007) | 3 lines
  Add a section about nested listcomps to the tutorial.
  Thanks to Ian Bruntlett and Robert Lehmann.
........
  r59504 | raymond.hettinger | 2007-12-14 20:19:59 +0100 (Fri, 14 Dec 2007) | 1 line
  Faster and simpler _replace() method
........
  r59505 | raymond.hettinger | 2007-12-14 22:51:50 +0100 (Fri, 14 Dec 2007) | 1 line
  Add usage note
........
  r59507 | andrew.kuchling | 2007-12-14 23:41:18 +0100 (Fri, 14 Dec 2007) | 1 line
  Remove warning about URL
........
  r59510 | andrew.kuchling | 2007-12-14 23:52:36 +0100 (Fri, 14 Dec 2007) | 1 line
  Bump the version number, and make a few small edits
........
  r59511 | christian.heimes | 2007-12-15 00:42:36 +0100 (Sat, 15 Dec 2007) | 2 lines
  Fixed bug #1628
  The detection now works on Unix with Makefile, Makefile with VPATH and on Windows.
........
											
										 
											2007-12-15 01:27:15 +00:00
										 |  |  |         self.assertEqual(sub.__class__.spam.__doc__, "SubClass.getter") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-24 01:46:21 +00:00
										 |  |  |     @unittest.skipIf(sys.flags.optimize >= 2, | 
					
						
							|  |  |  |                      "Docstrings are omitted with -O2 and above") | 
					
						
							|  |  |  |     def test_property_decorator_baseclass_doc(self): | 
					
						
							|  |  |  |         base = BaseClass() | 
					
						
							|  |  |  |         self.assertEqual(base.__class__.spam.__doc__, "BaseClass.getter") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
											  
											
												Merged revisions 59488-59511 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r59489 | christian.heimes | 2007-12-14 03:33:57 +0100 (Fri, 14 Dec 2007) | 1 line
  Silence a warning about an unsed variable in debug builds
........
  r59490 | christian.heimes | 2007-12-14 03:35:23 +0100 (Fri, 14 Dec 2007) | 2 lines
  Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
  I added also the feature that a @prop.getter decorator does not overwrite the doc string of the property if it was given as an argument to property().
........
  r59491 | raymond.hettinger | 2007-12-14 03:49:47 +0100 (Fri, 14 Dec 2007) | 1 line
  Cleaner method naming convention
........
  r59492 | christian.heimes | 2007-12-14 04:02:34 +0100 (Fri, 14 Dec 2007) | 1 line
  Fixed a warning in _codecs_iso2022.c and some non C89 conform // comments.
........
  r59493 | christian.heimes | 2007-12-14 05:38:13 +0100 (Fri, 14 Dec 2007) | 1 line
  Fixed warning in ssl module
........
  r59500 | raymond.hettinger | 2007-12-14 19:08:20 +0100 (Fri, 14 Dec 2007) | 1 line
  Add line spacing for readability
........
  r59501 | raymond.hettinger | 2007-12-14 19:12:21 +0100 (Fri, 14 Dec 2007) | 3 lines
  Update method names for named tuples.
........
  r59503 | georg.brandl | 2007-12-14 20:03:36 +0100 (Fri, 14 Dec 2007) | 3 lines
  Add a section about nested listcomps to the tutorial.
  Thanks to Ian Bruntlett and Robert Lehmann.
........
  r59504 | raymond.hettinger | 2007-12-14 20:19:59 +0100 (Fri, 14 Dec 2007) | 1 line
  Faster and simpler _replace() method
........
  r59505 | raymond.hettinger | 2007-12-14 22:51:50 +0100 (Fri, 14 Dec 2007) | 1 line
  Add usage note
........
  r59507 | andrew.kuchling | 2007-12-14 23:41:18 +0100 (Fri, 14 Dec 2007) | 1 line
  Remove warning about URL
........
  r59510 | andrew.kuchling | 2007-12-14 23:52:36 +0100 (Fri, 14 Dec 2007) | 1 line
  Bump the version number, and make a few small edits
........
  r59511 | christian.heimes | 2007-12-15 00:42:36 +0100 (Sat, 15 Dec 2007) | 2 lines
  Fixed bug #1628
  The detection now works on Unix with Makefile, Makefile with VPATH and on Windows.
........
											
										 
											2007-12-15 01:27:15 +00:00
										 |  |  |     def test_property_decorator_doc(self): | 
					
						
							|  |  |  |         base = PropertyDocBase() | 
					
						
							|  |  |  |         sub = PropertyDocSub() | 
					
						
							|  |  |  |         self.assertEqual(base.__class__.spam.__doc__, "spam spam spam") | 
					
						
							|  |  |  |         self.assertEqual(sub.__class__.spam.__doc__, "spam spam spam") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-28 15:43:25 +00:00
										 |  |  |     @unittest.skipIf(sys.flags.optimize >= 2, | 
					
						
							| 
									
										
										
										
											2010-02-24 01:46:21 +00:00
										 |  |  |                      "Docstrings are omitted with -O2 and above") | 
					
						
							| 
									
										
										
										
											2009-05-04 22:59:07 +00:00
										 |  |  |     def test_property_getter_doc_override(self): | 
					
						
							|  |  |  |         newgettersub = PropertySubNewGetter() | 
					
						
							|  |  |  |         self.assertEqual(newgettersub.spam, 5) | 
					
						
							|  |  |  |         self.assertEqual(newgettersub.__class__.spam.__doc__, "new docstring") | 
					
						
							|  |  |  |         newgetter = PropertyNewGetter() | 
					
						
							|  |  |  |         self.assertEqual(newgetter.spam, 8) | 
					
						
							|  |  |  |         self.assertEqual(newgetter.__class__.spam.__doc__, "new docstring") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-15 15:34:02 -05:00
										 |  |  |     def test_property___isabstractmethod__descriptor(self): | 
					
						
							|  |  |  |         for val in (True, False, [], [1], '', '1'): | 
					
						
							|  |  |  |             class C(object): | 
					
						
							|  |  |  |                 def foo(self): | 
					
						
							|  |  |  |                     pass | 
					
						
							|  |  |  |                 foo.__isabstractmethod__ = val | 
					
						
							|  |  |  |                 foo = property(foo) | 
					
						
							|  |  |  |             self.assertIs(C.foo.__isabstractmethod__, bool(val)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # check that the property's __isabstractmethod__ descriptor does the | 
					
						
							|  |  |  |         # right thing when presented with a value that fails truth testing: | 
					
						
							|  |  |  |         class NotBool(object): | 
					
						
							| 
									
										
										
										
											2015-03-12 21:56:08 +02:00
										 |  |  |             def __bool__(self): | 
					
						
							| 
									
										
										
										
											2011-12-15 15:34:02 -05:00
										 |  |  |                 raise ValueError() | 
					
						
							| 
									
										
										
										
											2015-03-12 21:56:08 +02:00
										 |  |  |             __len__ = __bool__ | 
					
						
							| 
									
										
										
										
											2011-12-15 15:34:02 -05:00
										 |  |  |         with self.assertRaises(ValueError): | 
					
						
							|  |  |  |             class C(object): | 
					
						
							|  |  |  |                 def foo(self): | 
					
						
							|  |  |  |                     pass | 
					
						
							|  |  |  |                 foo.__isabstractmethod__ = NotBool() | 
					
						
							|  |  |  |                 foo = property(foo) | 
					
						
							|  |  |  |             C.foo.__isabstractmethod__ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-13 01:09:59 -07:00
										 |  |  |     @unittest.skipIf(sys.flags.optimize >= 2, | 
					
						
							|  |  |  |                      "Docstrings are omitted with -O2 and above") | 
					
						
							|  |  |  |     def test_property_builtin_doc_writable(self): | 
					
						
							|  |  |  |         p = property(doc='basic') | 
					
						
							|  |  |  |         self.assertEqual(p.__doc__, 'basic') | 
					
						
							|  |  |  |         p.__doc__ = 'extended' | 
					
						
							|  |  |  |         self.assertEqual(p.__doc__, 'extended') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @unittest.skipIf(sys.flags.optimize >= 2, | 
					
						
							|  |  |  |                      "Docstrings are omitted with -O2 and above") | 
					
						
							|  |  |  |     def test_property_decorator_doc_writable(self): | 
					
						
							| 
									
										
										
										
											2015-12-11 23:48:13 +02:00
										 |  |  |         class PropertyWritableDoc(object): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             @property | 
					
						
							|  |  |  |             def spam(self): | 
					
						
							|  |  |  |                 """Eggs""" | 
					
						
							|  |  |  |                 return "eggs" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-13 01:09:59 -07:00
										 |  |  |         sub = PropertyWritableDoc() | 
					
						
							|  |  |  |         self.assertEqual(sub.__class__.spam.__doc__, 'Eggs') | 
					
						
							|  |  |  |         sub.__class__.spam.__doc__ = 'Spam' | 
					
						
							|  |  |  |         self.assertEqual(sub.__class__.spam.__doc__, 'Spam') | 
					
						
							| 
									
										
										
										
											2009-05-04 22:59:07 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-13 12:28:33 +02:00
										 |  |  |     @support.refcount_test | 
					
						
							|  |  |  |     def test_refleaks_in___init__(self): | 
					
						
							|  |  |  |         gettotalrefcount = support.get_attribute(sys, 'gettotalrefcount') | 
					
						
							|  |  |  |         fake_prop = property('fget', 'fset', 'fdel', 'doc') | 
					
						
							|  |  |  |         refs_before = gettotalrefcount() | 
					
						
							|  |  |  |         for i in range(100): | 
					
						
							|  |  |  |             fake_prop.__init__('fget', 'fset', 'fdel', 'doc') | 
					
						
							|  |  |  |         self.assertAlmostEqual(gettotalrefcount() - refs_before, 0, delta=10) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-30 11:51:24 +02:00
										 |  |  |     def test_property_set_name_incorrect_args(self): | 
					
						
							|  |  |  |         p = property() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         for i in (0, 1, 3): | 
					
						
							|  |  |  |             with self.assertRaisesRegex( | 
					
						
							|  |  |  |                 TypeError, | 
					
						
							|  |  |  |                 fr'^__set_name__\(\) takes 2 positional arguments but {i} were given$' | 
					
						
							|  |  |  |             ): | 
					
						
							|  |  |  |                 p.__set_name__(*([0] * i)) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-12 16:13:56 -06:00
										 |  |  |     def test_property_setname_on_property_subclass(self): | 
					
						
							|  |  |  |         # https://github.com/python/cpython/issues/100942 | 
					
						
							|  |  |  |         # Copy was setting the name field without first | 
					
						
							|  |  |  |         # verifying that the copy was an actual property | 
					
						
							|  |  |  |         # instance.  As a result, the code below was | 
					
						
							|  |  |  |         # causing a segfault. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         class pro(property): | 
					
						
							|  |  |  |             def __new__(typ, *args, **kwargs): | 
					
						
							|  |  |  |                 return "abcdef" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         class A: | 
					
						
							|  |  |  |             pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         p = property.__new__(pro) | 
					
						
							|  |  |  |         p.__set_name__(A, 1) | 
					
						
							|  |  |  |         np = p.getter(lambda self: 1) | 
					
						
							| 
									
										
										
										
											2018-02-13 12:28:33 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-04 22:59:07 +00:00
										 |  |  | # Issue 5890: subclasses of property do not preserve method __doc__ strings | 
					
						
							|  |  |  | class PropertySub(property): | 
					
						
							|  |  |  |     """This is a subclass of property""" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-29 06:25:51 +03:00
										 |  |  | class PropertySubWoDoc(property): | 
					
						
							|  |  |  |     pass | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-04 22:59:07 +00:00
										 |  |  | class PropertySubSlots(property): | 
					
						
							|  |  |  |     """This is a subclass of property that defines __slots__""" | 
					
						
							|  |  |  |     __slots__ = () | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class PropertySubclassTests(unittest.TestCase): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_slots_docstring_copy_exception(self): | 
					
						
							| 
									
										
										
										
											2023-06-04 20:18:15 -07:00
										 |  |  |         # A special case error that we preserve despite the GH-98963 behavior | 
					
						
							|  |  |  |         # that would otherwise silently ignore this error. | 
					
						
							|  |  |  |         # This came from commit b18500d39d791c879e9904ebac293402b4a7cd34 | 
					
						
							|  |  |  |         # as part of https://bugs.python.org/issue5890 which allowed docs to | 
					
						
							|  |  |  |         # be set via property subclasses in the first place. | 
					
						
							|  |  |  |         with self.assertRaises(AttributeError): | 
					
						
							| 
									
										
										
										
											2009-05-04 22:59:07 +00:00
										 |  |  |             class Foo(object): | 
					
						
							|  |  |  |                 @PropertySubSlots | 
					
						
							|  |  |  |                 def spam(self): | 
					
						
							|  |  |  |                     """Trying to copy this docstring will raise an exception""" | 
					
						
							|  |  |  |                     return 1 | 
					
						
							| 
									
										
										
										
											2023-06-04 20:18:15 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_property_with_slots_no_docstring(self): | 
					
						
							|  |  |  |         # https://github.com/python/cpython/issues/98963#issuecomment-1574413319 | 
					
						
							|  |  |  |         class slotted_prop(property): | 
					
						
							|  |  |  |             __slots__ = ("foo",) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         p = slotted_prop()  # no AttributeError | 
					
						
							|  |  |  |         self.assertIsNone(getattr(p, "__doc__", None)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def undocumented_getter(): | 
					
						
							|  |  |  |             return 4 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         p = slotted_prop(undocumented_getter)  # New in 3.12: no AttributeError | 
					
						
							|  |  |  |         self.assertIsNone(getattr(p, "__doc__", None)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @unittest.skipIf(sys.flags.optimize >= 2, | 
					
						
							|  |  |  |                      "Docstrings are omitted with -O2 and above") | 
					
						
							|  |  |  |     def test_property_with_slots_docstring_silently_dropped(self): | 
					
						
							|  |  |  |         # https://github.com/python/cpython/issues/98963#issuecomment-1574413319 | 
					
						
							|  |  |  |         class slotted_prop(property): | 
					
						
							|  |  |  |             __slots__ = ("foo",) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         p = slotted_prop(doc="what's up")  # no AttributeError | 
					
						
							|  |  |  |         self.assertIsNone(p.__doc__) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def documented_getter(): | 
					
						
							|  |  |  |             """getter doc.""" | 
					
						
							|  |  |  |             return 4 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # Historical behavior: A docstring from a getter always raises. | 
					
						
							|  |  |  |         # (matches test_slots_docstring_copy_exception above). | 
					
						
							|  |  |  |         with self.assertRaises(AttributeError): | 
					
						
							|  |  |  |             p = slotted_prop(documented_getter) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @unittest.skipIf(sys.flags.optimize >= 2, | 
					
						
							|  |  |  |                      "Docstrings are omitted with -O2 and above") | 
					
						
							|  |  |  |     def test_property_with_slots_and_doc_slot_docstring_present(self): | 
					
						
							|  |  |  |         # https://github.com/python/cpython/issues/98963#issuecomment-1574413319 | 
					
						
							|  |  |  |         class slotted_prop(property): | 
					
						
							|  |  |  |             __slots__ = ("foo", "__doc__") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         p = slotted_prop(doc="what's up") | 
					
						
							|  |  |  |         self.assertEqual("what's up", p.__doc__)  # new in 3.12: This gets set. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def documented_getter(): | 
					
						
							|  |  |  |             """what's up getter doc?""" | 
					
						
							|  |  |  |             return 4 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         p = slotted_prop(documented_getter) | 
					
						
							|  |  |  |         self.assertEqual("what's up getter doc?", p.__doc__) | 
					
						
							| 
									
										
										
										
											2009-05-04 22:59:07 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-29 06:25:51 +03:00
										 |  |  |     @unittest.skipIf(sys.flags.optimize >= 2, | 
					
						
							|  |  |  |                      "Docstrings are omitted with -O2 and above") | 
					
						
							|  |  |  |     def test_issue41287(self): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.assertEqual(PropertySub.__doc__, "This is a subclass of property", | 
					
						
							|  |  |  |                          "Docstring of `property` subclass is ignored") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         doc = PropertySub(None, None, None, "issue 41287 is fixed").__doc__ | 
					
						
							|  |  |  |         self.assertEqual(doc, "issue 41287 is fixed", | 
					
						
							|  |  |  |                          "Subclasses of `property` ignores `doc` constructor argument") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def getter(x): | 
					
						
							|  |  |  |             """Getter docstring""" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def getter_wo_doc(x): | 
					
						
							|  |  |  |             pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         for ps in property, PropertySub, PropertySubWoDoc: | 
					
						
							|  |  |  |             doc = ps(getter, None, None, "issue 41287 is fixed").__doc__ | 
					
						
							|  |  |  |             self.assertEqual(doc, "issue 41287 is fixed", | 
					
						
							|  |  |  |                              "Getter overrides explicit property docstring (%s)" % ps.__name__) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             doc = ps(getter, None, None, None).__doc__ | 
					
						
							|  |  |  |             self.assertEqual(doc, "Getter docstring", "Getter docstring is not picked-up (%s)" % ps.__name__) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             doc = ps(getter_wo_doc, None, None, "issue 41287 is fixed").__doc__ | 
					
						
							|  |  |  |             self.assertEqual(doc, "issue 41287 is fixed", | 
					
						
							|  |  |  |                              "Getter overrides explicit property docstring (%s)" % ps.__name__) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             doc = ps(getter_wo_doc, None, None, None).__doc__ | 
					
						
							|  |  |  |             self.assertIsNone(doc, "Property class doc appears in instance __doc__ (%s)" % ps.__name__) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-24 01:46:21 +00:00
										 |  |  |     @unittest.skipIf(sys.flags.optimize >= 2, | 
					
						
							|  |  |  |                      "Docstrings are omitted with -O2 and above") | 
					
						
							|  |  |  |     def test_docstring_copy(self): | 
					
						
							|  |  |  |         class Foo(object): | 
					
						
							|  |  |  |             @PropertySub | 
					
						
							|  |  |  |             def spam(self): | 
					
						
							|  |  |  |                 """spam wrapped in property subclass""" | 
					
						
							|  |  |  |                 return 1 | 
					
						
							|  |  |  |         self.assertEqual( | 
					
						
							|  |  |  |             Foo.spam.__doc__, | 
					
						
							|  |  |  |             "spam wrapped in property subclass") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-29 06:25:51 +03:00
										 |  |  |     @unittest.skipIf(sys.flags.optimize >= 2, | 
					
						
							|  |  |  |                      "Docstrings are omitted with -O2 and above") | 
					
						
							|  |  |  |     def test_docstring_copy2(self): | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         Property tries to provide the best docstring it finds for its instances. | 
					
						
							|  |  |  |         If a user-provided docstring is available, it is preserved on copies. | 
					
						
							|  |  |  |         If no docstring is available during property creation, the property | 
					
						
							|  |  |  |         will utilize the docstring from the getter if available. | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         def getter1(self): | 
					
						
							|  |  |  |             return 1 | 
					
						
							|  |  |  |         def getter2(self): | 
					
						
							|  |  |  |             """doc 2""" | 
					
						
							|  |  |  |             return 2 | 
					
						
							|  |  |  |         def getter3(self): | 
					
						
							|  |  |  |             """doc 3""" | 
					
						
							|  |  |  |             return 3 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # Case-1: user-provided doc is preserved in copies | 
					
						
							|  |  |  |         #         of property with undocumented getter | 
					
						
							|  |  |  |         p = property(getter1, None, None, "doc-A") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         p2 = p.getter(getter2) | 
					
						
							|  |  |  |         self.assertEqual(p.__doc__, "doc-A") | 
					
						
							|  |  |  |         self.assertEqual(p2.__doc__, "doc-A") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # Case-2: user-provided doc is preserved in copies | 
					
						
							|  |  |  |         #         of property with documented getter | 
					
						
							|  |  |  |         p = property(getter2, None, None, "doc-A") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         p2 = p.getter(getter3) | 
					
						
							|  |  |  |         self.assertEqual(p.__doc__, "doc-A") | 
					
						
							|  |  |  |         self.assertEqual(p2.__doc__, "doc-A") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # Case-3: with no user-provided doc new getter doc | 
					
						
							|  |  |  |         #         takes precendence | 
					
						
							|  |  |  |         p = property(getter2, None, None, None) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         p2 = p.getter(getter3) | 
					
						
							|  |  |  |         self.assertEqual(p.__doc__, "doc 2") | 
					
						
							|  |  |  |         self.assertEqual(p2.__doc__, "doc 3") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # Case-4: A user-provided doc is assigned after property construction | 
					
						
							|  |  |  |         #         with documented getter. The doc IS NOT preserved. | 
					
						
							|  |  |  |         #         It's an odd behaviour, but it's a strange enough | 
					
						
							|  |  |  |         #         use case with no easy solution. | 
					
						
							|  |  |  |         p = property(getter2, None, None, None) | 
					
						
							|  |  |  |         p.__doc__ = "user" | 
					
						
							|  |  |  |         p2 = p.getter(getter3) | 
					
						
							|  |  |  |         self.assertEqual(p.__doc__, "user") | 
					
						
							|  |  |  |         self.assertEqual(p2.__doc__, "doc 3") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # Case-5: A user-provided doc is assigned after property construction | 
					
						
							|  |  |  |         #         with UNdocumented getter. The doc IS preserved. | 
					
						
							|  |  |  |         p = property(getter1, None, None, None) | 
					
						
							|  |  |  |         p.__doc__ = "user" | 
					
						
							|  |  |  |         p2 = p.getter(getter2) | 
					
						
							|  |  |  |         self.assertEqual(p.__doc__, "user") | 
					
						
							|  |  |  |         self.assertEqual(p2.__doc__, "user") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-28 13:25:44 +02:00
										 |  |  |     @unittest.skipIf(sys.flags.optimize >= 2, | 
					
						
							| 
									
										
										
										
											2010-02-24 01:46:21 +00:00
										 |  |  |                      "Docstrings are omitted with -O2 and above") | 
					
						
							| 
									
										
										
										
											2009-05-04 22:59:07 +00:00
										 |  |  |     def test_property_setter_copies_getter_docstring(self): | 
					
						
							|  |  |  |         class Foo(object): | 
					
						
							|  |  |  |             def __init__(self): self._spam = 1 | 
					
						
							|  |  |  |             @PropertySub | 
					
						
							|  |  |  |             def spam(self): | 
					
						
							|  |  |  |                 """spam wrapped in property subclass""" | 
					
						
							|  |  |  |                 return self._spam | 
					
						
							|  |  |  |             @spam.setter | 
					
						
							|  |  |  |             def spam(self, value): | 
					
						
							|  |  |  |                 """this docstring is ignored""" | 
					
						
							|  |  |  |                 self._spam = value | 
					
						
							|  |  |  |         foo = Foo() | 
					
						
							|  |  |  |         self.assertEqual(foo.spam, 1) | 
					
						
							|  |  |  |         foo.spam = 2 | 
					
						
							|  |  |  |         self.assertEqual(foo.spam, 2) | 
					
						
							|  |  |  |         self.assertEqual( | 
					
						
							|  |  |  |             Foo.spam.__doc__, | 
					
						
							|  |  |  |             "spam wrapped in property subclass") | 
					
						
							|  |  |  |         class FooSub(Foo): | 
					
						
							|  |  |  |             @Foo.spam.setter | 
					
						
							|  |  |  |             def spam(self, value): | 
					
						
							|  |  |  |                 """another ignored docstring""" | 
					
						
							|  |  |  |                 self._spam = 'eggs' | 
					
						
							|  |  |  |         foosub = FooSub() | 
					
						
							|  |  |  |         self.assertEqual(foosub.spam, 1) | 
					
						
							|  |  |  |         foosub.spam = 7 | 
					
						
							|  |  |  |         self.assertEqual(foosub.spam, 'eggs') | 
					
						
							|  |  |  |         self.assertEqual( | 
					
						
							|  |  |  |             FooSub.spam.__doc__, | 
					
						
							|  |  |  |             "spam wrapped in property subclass") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-28 13:25:44 +02:00
										 |  |  |     @unittest.skipIf(sys.flags.optimize >= 2, | 
					
						
							| 
									
										
										
										
											2010-02-24 01:46:21 +00:00
										 |  |  |                      "Docstrings are omitted with -O2 and above") | 
					
						
							| 
									
										
										
										
											2009-05-04 22:59:07 +00:00
										 |  |  |     def test_property_new_getter_new_docstring(self): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         class Foo(object): | 
					
						
							|  |  |  |             @PropertySub | 
					
						
							|  |  |  |             def spam(self): | 
					
						
							|  |  |  |                 """a docstring""" | 
					
						
							|  |  |  |                 return 1 | 
					
						
							|  |  |  |             @spam.getter | 
					
						
							|  |  |  |             def spam(self): | 
					
						
							|  |  |  |                 """a new docstring""" | 
					
						
							|  |  |  |                 return 2 | 
					
						
							|  |  |  |         self.assertEqual(Foo.spam.__doc__, "a new docstring") | 
					
						
							|  |  |  |         class FooBase(object): | 
					
						
							|  |  |  |             @PropertySub | 
					
						
							|  |  |  |             def spam(self): | 
					
						
							|  |  |  |                 """a docstring""" | 
					
						
							|  |  |  |                 return 1 | 
					
						
							|  |  |  |         class Foo2(FooBase): | 
					
						
							|  |  |  |             @FooBase.spam.getter | 
					
						
							|  |  |  |             def spam(self): | 
					
						
							|  |  |  |                 """a new docstring""" | 
					
						
							|  |  |  |                 return 2 | 
					
						
							|  |  |  |         self.assertEqual(Foo.spam.__doc__, "a new docstring") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-30 11:51:24 +02:00
										 |  |  | class _PropertyUnreachableAttribute: | 
					
						
							|  |  |  |     msg_format = None | 
					
						
							|  |  |  |     obj = None | 
					
						
							|  |  |  |     cls = None | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def _format_exc_msg(self, msg): | 
					
						
							|  |  |  |         return self.msg_format.format(msg) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @classmethod | 
					
						
							|  |  |  |     def setUpClass(cls): | 
					
						
							|  |  |  |         cls.obj = cls.cls() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_get_property(self): | 
					
						
							| 
									
										
										
										
											2022-02-16 10:07:34 +03:00
										 |  |  |         with self.assertRaisesRegex(AttributeError, self._format_exc_msg("has no getter")): | 
					
						
							| 
									
										
										
										
											2020-12-30 11:51:24 +02:00
										 |  |  |             self.obj.foo | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_set_property(self): | 
					
						
							| 
									
										
										
										
											2022-02-16 10:07:34 +03:00
										 |  |  |         with self.assertRaisesRegex(AttributeError, self._format_exc_msg("has no setter")): | 
					
						
							| 
									
										
										
										
											2020-12-30 11:51:24 +02:00
										 |  |  |             self.obj.foo = None | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_del_property(self): | 
					
						
							| 
									
										
										
										
											2022-02-16 10:07:34 +03:00
										 |  |  |         with self.assertRaisesRegex(AttributeError, self._format_exc_msg("has no deleter")): | 
					
						
							| 
									
										
										
										
											2020-12-30 11:51:24 +02:00
										 |  |  |             del self.obj.foo | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class PropertyUnreachableAttributeWithName(_PropertyUnreachableAttribute, unittest.TestCase): | 
					
						
							| 
									
										
										
										
											2022-02-16 10:07:34 +03:00
										 |  |  |     msg_format = r"^property 'foo' of 'PropertyUnreachableAttributeWithName\.cls' object {}$" | 
					
						
							| 
									
										
										
										
											2020-12-30 11:51:24 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     class cls: | 
					
						
							|  |  |  |         foo = property() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class PropertyUnreachableAttributeNoName(_PropertyUnreachableAttribute, unittest.TestCase): | 
					
						
							| 
									
										
										
										
											2022-02-19 00:57:36 -05:00
										 |  |  |     msg_format = r"^property of 'PropertyUnreachableAttributeNoName\.cls' object {}$" | 
					
						
							| 
									
										
										
										
											2020-12-30 11:51:24 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     class cls: | 
					
						
							|  |  |  |         pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     cls.foo = property() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-04 22:59:07 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
											  
											
												Merged revisions 59488-59511 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r59489 | christian.heimes | 2007-12-14 03:33:57 +0100 (Fri, 14 Dec 2007) | 1 line
  Silence a warning about an unsed variable in debug builds
........
  r59490 | christian.heimes | 2007-12-14 03:35:23 +0100 (Fri, 14 Dec 2007) | 2 lines
  Fixed bug #1620: New @spam.getter property syntax modifies the property in place.
  I added also the feature that a @prop.getter decorator does not overwrite the doc string of the property if it was given as an argument to property().
........
  r59491 | raymond.hettinger | 2007-12-14 03:49:47 +0100 (Fri, 14 Dec 2007) | 1 line
  Cleaner method naming convention
........
  r59492 | christian.heimes | 2007-12-14 04:02:34 +0100 (Fri, 14 Dec 2007) | 1 line
  Fixed a warning in _codecs_iso2022.c and some non C89 conform // comments.
........
  r59493 | christian.heimes | 2007-12-14 05:38:13 +0100 (Fri, 14 Dec 2007) | 1 line
  Fixed warning in ssl module
........
  r59500 | raymond.hettinger | 2007-12-14 19:08:20 +0100 (Fri, 14 Dec 2007) | 1 line
  Add line spacing for readability
........
  r59501 | raymond.hettinger | 2007-12-14 19:12:21 +0100 (Fri, 14 Dec 2007) | 3 lines
  Update method names for named tuples.
........
  r59503 | georg.brandl | 2007-12-14 20:03:36 +0100 (Fri, 14 Dec 2007) | 3 lines
  Add a section about nested listcomps to the tutorial.
  Thanks to Ian Bruntlett and Robert Lehmann.
........
  r59504 | raymond.hettinger | 2007-12-14 20:19:59 +0100 (Fri, 14 Dec 2007) | 1 line
  Faster and simpler _replace() method
........
  r59505 | raymond.hettinger | 2007-12-14 22:51:50 +0100 (Fri, 14 Dec 2007) | 1 line
  Add usage note
........
  r59507 | andrew.kuchling | 2007-12-14 23:41:18 +0100 (Fri, 14 Dec 2007) | 1 line
  Remove warning about URL
........
  r59510 | andrew.kuchling | 2007-12-14 23:52:36 +0100 (Fri, 14 Dec 2007) | 1 line
  Bump the version number, and make a few small edits
........
  r59511 | christian.heimes | 2007-12-15 00:42:36 +0100 (Sat, 15 Dec 2007) | 2 lines
  Fixed bug #1628
  The detection now works on Unix with Makefile, Makefile with VPATH and on Windows.
........
											
										 
											2007-12-15 01:27:15 +00:00
										 |  |  | if __name__ == '__main__': | 
					
						
							| 
									
										
										
										
											2015-04-13 15:00:43 -05:00
										 |  |  |     unittest.main() |