| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  | # Copyright 2007 Google, Inc. All Rights Reserved. | 
					
						
							|  |  |  | # Licensed to PSF under a Contributor Agreement. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-07 15:15:49 +00:00
										 |  |  | """Abstract Base Classes (ABCs) for numbers, according to PEP 3141.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TODO: Fill out more detailed documentation on the operators."""
 | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-15 15:34:02 -05:00
										 |  |  | from abc import ABCMeta, abstractmethod | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-03-16 00:32:36 +00:00
										 |  |  | __all__ = ["Number", "Complex", "Real", "Rational", "Integral"] | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | class Number(metaclass=ABCMeta): | 
					
						
							|  |  |  |     """All numbers inherit from this class.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     If you just want to check if an argument x is a number, without | 
					
						
							|  |  |  |     caring what kind, use isinstance(x, Number). | 
					
						
							|  |  |  |     """
 | 
					
						
							| 
									
										
										
										
											2009-02-12 17:58:36 +00:00
										 |  |  |     __slots__ = () | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-18 12:31:52 +00:00
										 |  |  |     # Concrete numeric types must provide their own hash implementation | 
					
						
							|  |  |  |     __hash__ = None | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
											  
											
												Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60766,60769-60786 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r60752 | mark.dickinson | 2008-02-12 22:31:59 +0100 (Tue, 12 Feb 2008) | 5 lines
  Implementation of Fraction.limit_denominator.
  Remove Fraction.to_continued_fraction and
  Fraction.from_continued_fraction
........
  r60754 | mark.dickinson | 2008-02-12 22:40:53 +0100 (Tue, 12 Feb 2008) | 3 lines
  Revert change in r60712:  turn alternate constructors back into
  classmethods instead of staticmethods.
........
  r60755 | mark.dickinson | 2008-02-12 22:46:54 +0100 (Tue, 12 Feb 2008) | 4 lines
  Replace R=fractions.Fraction with F=fractions.Fraction in
  test_fractions.py.  This should have been part of the name
  change from Rational to Fraction.
........
  r60758 | georg.brandl | 2008-02-13 08:20:22 +0100 (Wed, 13 Feb 2008) | 3 lines
  #2063: correct order of utime and stime in os.times()
  result on Windows.
........
  r60762 | jeffrey.yasskin | 2008-02-13 18:58:04 +0100 (Wed, 13 Feb 2008) | 7 lines
  Working on issue #1762: Brought
    ./python.exe -m timeit -s 'from fractions import Fraction; f = Fraction(3, 2)' 'isinstance(3, Fraction); isinstance(f, Fraction)'
  from 12.3 usec/loop to 3.44 usec/loop and
    ./python.exe -m timeit -s 'from fractions import Fraction' 'Fraction(3, 2)'
  from 48.8 usec to 23.6 usec by avoiding genexps and sets in __instancecheck__
  and inlining the common case from __subclasscheck__.
........
  r60765 | brett.cannon | 2008-02-13 20:15:44 +0100 (Wed, 13 Feb 2008) | 5 lines
  Fix --enable-universalsdk and its comment line so that zsh's flag completion
  works.
  Thanks to Jeroen Ruigrok van der Werven for the fix.
........
  r60771 | kurt.kaiser | 2008-02-14 01:08:55 +0100 (Thu, 14 Feb 2008) | 2 lines
  Bring NEWS.txt up to date from check-in msgs.
........
  r60772 | raymond.hettinger | 2008-02-14 02:08:02 +0100 (Thu, 14 Feb 2008) | 3 lines
  Update notes on Decimal.
........
  r60773 | raymond.hettinger | 2008-02-14 03:41:22 +0100 (Thu, 14 Feb 2008) | 1 line
  Fix decimal repr which should have used single quotes like other reprs.
........
  r60785 | jeffrey.yasskin | 2008-02-14 07:12:24 +0100 (Thu, 14 Feb 2008) | 11 lines
  Performance optimizations on Fraction's constructor.
    ./python.exe -m timeit -s 'from fractions import Fraction' 'Fraction(3)`
  31.7 usec/loop -> 9.2 usec/loop
    ./python.exe -m timeit -s 'from fractions import Fraction' 'Fraction(3, 2)'`
  27.7 usec/loop -> 9.32 usec/loop
    ./python.exe -m timeit -s 'from fractions import Fraction; f = Fraction(3, 2)' 'Fraction(f)'
  31.9 usec/loop -> 14.3 usec/loop
........
  r60786 | jeffrey.yasskin | 2008-02-14 08:49:25 +0100 (Thu, 14 Feb 2008) | 5 lines
  Change simple instances (in Fraction) of self.numerator and self.denominator to
  self._numerator and self._denominator. This speeds abs() up from 12.2us to
  10.8us and trunc() from 2.07us to 1.11us. This doesn't change _add and friends
  because they're more complicated.
........
											
										 
											2008-02-14 08:27:37 +00:00
										 |  |  | ## Notes on Decimal | 
					
						
							|  |  |  | ## ---------------- | 
					
						
							|  |  |  | ## Decimal has all of the methods specified by the Real abc, but it should | 
					
						
							|  |  |  | ## not be registered as a Real because decimals do not interoperate with | 
					
						
							| 
									
										
										
										
											2008-03-16 00:32:36 +00:00
										 |  |  | ## binary floats (i.e.  Decimal('3.14') + 2.71828 is undefined).  But, | 
					
						
							|  |  |  | ## abstract reals are expected to interoperate (i.e. R1 + R2 should be | 
					
						
							|  |  |  | ## expected to work if R1 and R2 are both Reals). | 
					
						
							| 
									
										
											  
											
												Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60735-60751 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r60735 | raymond.hettinger | 2008-02-11 23:53:01 +0100 (Mon, 11 Feb 2008) | 1 line
  Add notes on how decimal fits into the model.
........
  r60737 | raymond.hettinger | 2008-02-12 00:34:56 +0100 (Tue, 12 Feb 2008) | 1 line
  Fix markup
........
  r60738 | raymond.hettinger | 2008-02-12 00:38:00 +0100 (Tue, 12 Feb 2008) | 1 line
  Backport ABC docs
........
  r60739 | raymond.hettinger | 2008-02-12 01:15:32 +0100 (Tue, 12 Feb 2008) | 1 line
  Restore fractions.rst to the document tree.
........
  r60740 | raymond.hettinger | 2008-02-12 01:48:20 +0100 (Tue, 12 Feb 2008) | 1 line
  Fix typo in comments
........
  r60741 | raymond.hettinger | 2008-02-12 02:18:03 +0100 (Tue, 12 Feb 2008) | 1 line
  Bring decimal a bit closer to the spec for Reals.
........
  r60743 | martin.v.loewis | 2008-02-12 14:47:26 +0100 (Tue, 12 Feb 2008) | 2 lines
  Patch #1736: Fix file name handling of _msi.FCICreate.
........
  r60745 | kurt.kaiser | 2008-02-12 16:45:50 +0100 (Tue, 12 Feb 2008) | 2 lines
  what??! Correct r60225.
........
  r60747 | martin.v.loewis | 2008-02-12 19:47:34 +0100 (Tue, 12 Feb 2008) | 4 lines
  Patch #1966: Break infinite loop in httplib when the servers
  implements the chunked encoding incorrectly.
  Will backport to 2.5.
........
  r60749 | raymond.hettinger | 2008-02-12 20:05:36 +0100 (Tue, 12 Feb 2008) | 1 line
  dict.copy() rises from the ashes.  Revert r60687.
........
											
										 
											2008-02-12 22:59:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  | class Complex(Number): | 
					
						
							|  |  |  |     """Complex defines the operations that work on the builtin complex type.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     In short, those are: a conversion to complex, .real, .imag, +, -, | 
					
						
							|  |  |  |     *, /, abs(), .conjugate, ==, and !=. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     If it is given heterogenous arguments, and doesn't have special | 
					
						
							|  |  |  |     knowledge about them, it should fall back to the builtin complex | 
					
						
							|  |  |  |     type as described below. | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-12 17:58:36 +00:00
										 |  |  |     __slots__ = () | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  |     @abstractmethod | 
					
						
							|  |  |  |     def __complex__(self): | 
					
						
							| 
									
										
										
										
											2007-09-07 15:15:49 +00:00
										 |  |  |         """Return a builtin complex instance. Called for complex(self).""" | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-17 07:36:30 +00:00
										 |  |  |     def __bool__(self): | 
					
						
							| 
									
										
										
										
											2007-09-07 15:15:49 +00:00
										 |  |  |         """True if self != 0. Called for bool(self).""" | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  |         return self != 0 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-15 15:34:02 -05:00
										 |  |  |     @property | 
					
						
							|  |  |  |     @abstractmethod | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  |     def real(self): | 
					
						
							|  |  |  |         """Retrieve the real component of this number.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         This should subclass Real. | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         raise NotImplementedError | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-15 15:34:02 -05:00
										 |  |  |     @property | 
					
						
							|  |  |  |     @abstractmethod | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  |     def imag(self): | 
					
						
							| 
									
										
										
										
											2010-12-23 22:17:42 +00:00
										 |  |  |         """Retrieve the imaginary component of this number.
 | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         This should subclass Real. | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         raise NotImplementedError | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @abstractmethod | 
					
						
							|  |  |  |     def __add__(self, other): | 
					
						
							| 
									
										
										
										
											2007-09-07 15:15:49 +00:00
										 |  |  |         """self + other""" | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  |         raise NotImplementedError | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @abstractmethod | 
					
						
							|  |  |  |     def __radd__(self, other): | 
					
						
							| 
									
										
										
										
											2007-09-07 15:15:49 +00:00
										 |  |  |         """other + self""" | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  |         raise NotImplementedError | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @abstractmethod | 
					
						
							|  |  |  |     def __neg__(self): | 
					
						
							| 
									
										
										
										
											2007-09-07 15:15:49 +00:00
										 |  |  |         """-self""" | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  |         raise NotImplementedError | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
											  
											
												Merged revisions 59952-59984 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r59952 | thomas.heller | 2008-01-14 02:35:28 -0800 (Mon, 14 Jan 2008) | 1 line
  Issue 1821: configure libffi for amd64 on FreeeBSD.
........
  r59953 | andrew.kuchling | 2008-01-14 06:48:43 -0800 (Mon, 14 Jan 2008) | 1 line
  Update description of float_info
........
  r59959 | raymond.hettinger | 2008-01-14 14:58:05 -0800 (Mon, 14 Jan 2008) | 1 line
  Fix 1698398:  Zipfile.printdir() crashed because the format string expected a tuple object of length six instead of a time.struct_time object.
........
  r59961 | andrew.kuchling | 2008-01-14 17:29:16 -0800 (Mon, 14 Jan 2008) | 1 line
  Typo fixes
........
  r59962 | andrew.kuchling | 2008-01-14 17:29:44 -0800 (Mon, 14 Jan 2008) | 1 line
  Markup fix
........
  r59963 | andrew.kuchling | 2008-01-14 17:47:32 -0800 (Mon, 14 Jan 2008) | 1 line
  Add many items
........
  r59964 | andrew.kuchling | 2008-01-14 17:55:32 -0800 (Mon, 14 Jan 2008) | 1 line
  Repair unfinished sentence
........
  r59967 | raymond.hettinger | 2008-01-14 19:02:37 -0800 (Mon, 14 Jan 2008) | 5 lines
  Issue 1820:  structseq objects did not work with the % formatting operator or isinstance(t, tuple).
  Orignal patch (without tests) by Leif Walsh.
........
  r59968 | raymond.hettinger | 2008-01-14 19:07:42 -0800 (Mon, 14 Jan 2008) | 1 line
  Tighten the definition of a named tuple.
........
  r59969 | skip.montanaro | 2008-01-14 19:40:20 -0800 (Mon, 14 Jan 2008) | 3 lines
  Better (?) text describing the lack of guarantees provided by qsize(),
  empty() and full().
........
  r59970 | raymond.hettinger | 2008-01-14 21:39:59 -0800 (Mon, 14 Jan 2008) | 1 line
  Temporarily revert 59967 until GC can be added.
........
  r59971 | raymond.hettinger | 2008-01-14 21:46:43 -0800 (Mon, 14 Jan 2008) | 1 line
  Small grammar nit
........
  r59972 | georg.brandl | 2008-01-14 22:55:56 -0800 (Mon, 14 Jan 2008) | 2 lines
  Typo.
........
  r59973 | georg.brandl | 2008-01-14 22:58:15 -0800 (Mon, 14 Jan 2008) | 2 lines
  Remove duplicate entry.
........
  r59974 | jeffrey.yasskin | 2008-01-14 23:46:24 -0800 (Mon, 14 Jan 2008) | 12 lines
  Add rational.Rational as an implementation of numbers.Rational with infinite
  precision. This has been discussed at http://bugs.python.org/issue1682. It's
  useful primarily for teaching, but it also demonstrates how to implement a
  member of the numeric tower, including fallbacks for mixed-mode arithmetic.
  I expect to write a couple more patches in this area:
   * Rational.from_decimal()
   * Rational.trim/approximate() (maybe with different names)
   * Maybe remove the parentheses from Rational.__str__()
   * Maybe rename one of the Rational classes
   * Maybe make Rational('3/2') work.
........
  r59978 | andrew.kuchling | 2008-01-15 06:38:05 -0800 (Tue, 15 Jan 2008) | 8 lines
  Restore description of sys.dont_write_bytecode.
  The duplication is intentional -- this paragraph is in a section
  describing additions to the sys module, and there's a later section
  that mentions the switch.  I think most people scan the what's-new and
  don't read it in detail, so a bit of duplication is OK.
........
  r59984 | guido.van.rossum | 2008-01-15 09:59:29 -0800 (Tue, 15 Jan 2008) | 3 lines
  Issue #1786 (by myself): pdb should use its own stdin/stdout around an
  exec call and when creating a recursive instance.
........
											
										 
											2008-01-15 21:44:53 +00:00
										 |  |  |     @abstractmethod | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  |     def __pos__(self): | 
					
						
							| 
									
										
										
										
											2007-09-07 15:15:49 +00:00
										 |  |  |         """+self""" | 
					
						
							| 
									
										
										
										
											2007-12-06 17:45:33 +00:00
										 |  |  |         raise NotImplementedError | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def __sub__(self, other): | 
					
						
							| 
									
										
										
										
											2007-09-07 15:15:49 +00:00
										 |  |  |         """self - other""" | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  |         return self + -other | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __rsub__(self, other): | 
					
						
							| 
									
										
										
										
											2007-09-07 15:15:49 +00:00
										 |  |  |         """other - self""" | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  |         return -self + other | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @abstractmethod | 
					
						
							|  |  |  |     def __mul__(self, other): | 
					
						
							| 
									
										
										
										
											2007-09-07 15:15:49 +00:00
										 |  |  |         """self * other""" | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  |         raise NotImplementedError | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @abstractmethod | 
					
						
							|  |  |  |     def __rmul__(self, other): | 
					
						
							| 
									
										
										
										
											2007-09-07 15:15:49 +00:00
										 |  |  |         """other * self""" | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  |         raise NotImplementedError | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
											  
											
												Merged revisions 59952-59984 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r59952 | thomas.heller | 2008-01-14 02:35:28 -0800 (Mon, 14 Jan 2008) | 1 line
  Issue 1821: configure libffi for amd64 on FreeeBSD.
........
  r59953 | andrew.kuchling | 2008-01-14 06:48:43 -0800 (Mon, 14 Jan 2008) | 1 line
  Update description of float_info
........
  r59959 | raymond.hettinger | 2008-01-14 14:58:05 -0800 (Mon, 14 Jan 2008) | 1 line
  Fix 1698398:  Zipfile.printdir() crashed because the format string expected a tuple object of length six instead of a time.struct_time object.
........
  r59961 | andrew.kuchling | 2008-01-14 17:29:16 -0800 (Mon, 14 Jan 2008) | 1 line
  Typo fixes
........
  r59962 | andrew.kuchling | 2008-01-14 17:29:44 -0800 (Mon, 14 Jan 2008) | 1 line
  Markup fix
........
  r59963 | andrew.kuchling | 2008-01-14 17:47:32 -0800 (Mon, 14 Jan 2008) | 1 line
  Add many items
........
  r59964 | andrew.kuchling | 2008-01-14 17:55:32 -0800 (Mon, 14 Jan 2008) | 1 line
  Repair unfinished sentence
........
  r59967 | raymond.hettinger | 2008-01-14 19:02:37 -0800 (Mon, 14 Jan 2008) | 5 lines
  Issue 1820:  structseq objects did not work with the % formatting operator or isinstance(t, tuple).
  Orignal patch (without tests) by Leif Walsh.
........
  r59968 | raymond.hettinger | 2008-01-14 19:07:42 -0800 (Mon, 14 Jan 2008) | 1 line
  Tighten the definition of a named tuple.
........
  r59969 | skip.montanaro | 2008-01-14 19:40:20 -0800 (Mon, 14 Jan 2008) | 3 lines
  Better (?) text describing the lack of guarantees provided by qsize(),
  empty() and full().
........
  r59970 | raymond.hettinger | 2008-01-14 21:39:59 -0800 (Mon, 14 Jan 2008) | 1 line
  Temporarily revert 59967 until GC can be added.
........
  r59971 | raymond.hettinger | 2008-01-14 21:46:43 -0800 (Mon, 14 Jan 2008) | 1 line
  Small grammar nit
........
  r59972 | georg.brandl | 2008-01-14 22:55:56 -0800 (Mon, 14 Jan 2008) | 2 lines
  Typo.
........
  r59973 | georg.brandl | 2008-01-14 22:58:15 -0800 (Mon, 14 Jan 2008) | 2 lines
  Remove duplicate entry.
........
  r59974 | jeffrey.yasskin | 2008-01-14 23:46:24 -0800 (Mon, 14 Jan 2008) | 12 lines
  Add rational.Rational as an implementation of numbers.Rational with infinite
  precision. This has been discussed at http://bugs.python.org/issue1682. It's
  useful primarily for teaching, but it also demonstrates how to implement a
  member of the numeric tower, including fallbacks for mixed-mode arithmetic.
  I expect to write a couple more patches in this area:
   * Rational.from_decimal()
   * Rational.trim/approximate() (maybe with different names)
   * Maybe remove the parentheses from Rational.__str__()
   * Maybe rename one of the Rational classes
   * Maybe make Rational('3/2') work.
........
  r59978 | andrew.kuchling | 2008-01-15 06:38:05 -0800 (Tue, 15 Jan 2008) | 8 lines
  Restore description of sys.dont_write_bytecode.
  The duplication is intentional -- this paragraph is in a section
  describing additions to the sys module, and there's a later section
  that mentions the switch.  I think most people scan the what's-new and
  don't read it in detail, so a bit of duplication is OK.
........
  r59984 | guido.van.rossum | 2008-01-15 09:59:29 -0800 (Tue, 15 Jan 2008) | 3 lines
  Issue #1786 (by myself): pdb should use its own stdin/stdout around an
  exec call and when creating a recursive instance.
........
											
										 
											2008-01-15 21:44:53 +00:00
										 |  |  |     @abstractmethod | 
					
						
							|  |  |  |     def __truediv__(self, other): | 
					
						
							| 
									
										
										
										
											2008-01-17 07:36:30 +00:00
										 |  |  |         """self / other: Should promote to float when necessary.""" | 
					
						
							| 
									
										
											  
											
												Merged revisions 59952-59984 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r59952 | thomas.heller | 2008-01-14 02:35:28 -0800 (Mon, 14 Jan 2008) | 1 line
  Issue 1821: configure libffi for amd64 on FreeeBSD.
........
  r59953 | andrew.kuchling | 2008-01-14 06:48:43 -0800 (Mon, 14 Jan 2008) | 1 line
  Update description of float_info
........
  r59959 | raymond.hettinger | 2008-01-14 14:58:05 -0800 (Mon, 14 Jan 2008) | 1 line
  Fix 1698398:  Zipfile.printdir() crashed because the format string expected a tuple object of length six instead of a time.struct_time object.
........
  r59961 | andrew.kuchling | 2008-01-14 17:29:16 -0800 (Mon, 14 Jan 2008) | 1 line
  Typo fixes
........
  r59962 | andrew.kuchling | 2008-01-14 17:29:44 -0800 (Mon, 14 Jan 2008) | 1 line
  Markup fix
........
  r59963 | andrew.kuchling | 2008-01-14 17:47:32 -0800 (Mon, 14 Jan 2008) | 1 line
  Add many items
........
  r59964 | andrew.kuchling | 2008-01-14 17:55:32 -0800 (Mon, 14 Jan 2008) | 1 line
  Repair unfinished sentence
........
  r59967 | raymond.hettinger | 2008-01-14 19:02:37 -0800 (Mon, 14 Jan 2008) | 5 lines
  Issue 1820:  structseq objects did not work with the % formatting operator or isinstance(t, tuple).
  Orignal patch (without tests) by Leif Walsh.
........
  r59968 | raymond.hettinger | 2008-01-14 19:07:42 -0800 (Mon, 14 Jan 2008) | 1 line
  Tighten the definition of a named tuple.
........
  r59969 | skip.montanaro | 2008-01-14 19:40:20 -0800 (Mon, 14 Jan 2008) | 3 lines
  Better (?) text describing the lack of guarantees provided by qsize(),
  empty() and full().
........
  r59970 | raymond.hettinger | 2008-01-14 21:39:59 -0800 (Mon, 14 Jan 2008) | 1 line
  Temporarily revert 59967 until GC can be added.
........
  r59971 | raymond.hettinger | 2008-01-14 21:46:43 -0800 (Mon, 14 Jan 2008) | 1 line
  Small grammar nit
........
  r59972 | georg.brandl | 2008-01-14 22:55:56 -0800 (Mon, 14 Jan 2008) | 2 lines
  Typo.
........
  r59973 | georg.brandl | 2008-01-14 22:58:15 -0800 (Mon, 14 Jan 2008) | 2 lines
  Remove duplicate entry.
........
  r59974 | jeffrey.yasskin | 2008-01-14 23:46:24 -0800 (Mon, 14 Jan 2008) | 12 lines
  Add rational.Rational as an implementation of numbers.Rational with infinite
  precision. This has been discussed at http://bugs.python.org/issue1682. It's
  useful primarily for teaching, but it also demonstrates how to implement a
  member of the numeric tower, including fallbacks for mixed-mode arithmetic.
  I expect to write a couple more patches in this area:
   * Rational.from_decimal()
   * Rational.trim/approximate() (maybe with different names)
   * Maybe remove the parentheses from Rational.__str__()
   * Maybe rename one of the Rational classes
   * Maybe make Rational('3/2') work.
........
  r59978 | andrew.kuchling | 2008-01-15 06:38:05 -0800 (Tue, 15 Jan 2008) | 8 lines
  Restore description of sys.dont_write_bytecode.
  The duplication is intentional -- this paragraph is in a section
  describing additions to the sys module, and there's a later section
  that mentions the switch.  I think most people scan the what's-new and
  don't read it in detail, so a bit of duplication is OK.
........
  r59984 | guido.van.rossum | 2008-01-15 09:59:29 -0800 (Tue, 15 Jan 2008) | 3 lines
  Issue #1786 (by myself): pdb should use its own stdin/stdout around an
  exec call and when creating a recursive instance.
........
											
										 
											2008-01-15 21:44:53 +00:00
										 |  |  |         raise NotImplementedError | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @abstractmethod | 
					
						
							|  |  |  |     def __rtruediv__(self, other): | 
					
						
							| 
									
										
										
										
											2008-01-17 07:36:30 +00:00
										 |  |  |         """other / self""" | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  |         raise NotImplementedError | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @abstractmethod | 
					
						
							|  |  |  |     def __pow__(self, exponent): | 
					
						
							| 
									
										
										
										
											2007-12-06 17:45:33 +00:00
										 |  |  |         """self**exponent; should promote to float or complex when necessary.""" | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  |         raise NotImplementedError | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @abstractmethod | 
					
						
							|  |  |  |     def __rpow__(self, base): | 
					
						
							| 
									
										
										
										
											2007-09-07 15:15:49 +00:00
										 |  |  |         """base ** self""" | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  |         raise NotImplementedError | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @abstractmethod | 
					
						
							|  |  |  |     def __abs__(self): | 
					
						
							| 
									
										
										
										
											2007-09-07 15:15:49 +00:00
										 |  |  |         """Returns the Real distance from 0. Called for abs(self).""" | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  |         raise NotImplementedError | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @abstractmethod | 
					
						
							|  |  |  |     def conjugate(self): | 
					
						
							|  |  |  |         """(x+y*i).conjugate() returns (x-y*i).""" | 
					
						
							|  |  |  |         raise NotImplementedError | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @abstractmethod | 
					
						
							|  |  |  |     def __eq__(self, other): | 
					
						
							| 
									
										
										
										
											2007-09-07 15:15:49 +00:00
										 |  |  |         """self == other""" | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  |         raise NotImplementedError | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Complex.register(complex) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Real(Complex): | 
					
						
							|  |  |  |     """To Complex, Real adds the operations that work on real numbers.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     In short, those are: a conversion to float, trunc(), divmod, | 
					
						
							|  |  |  |     %, <, <=, >, and >=. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Real also provides defaults for the derived operations. | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-12 17:58:36 +00:00
										 |  |  |     __slots__ = () | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  |     @abstractmethod | 
					
						
							|  |  |  |     def __float__(self): | 
					
						
							| 
									
										
										
										
											2007-09-07 15:15:49 +00:00
										 |  |  |         """Any Real can be converted to a native float object.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         Called for float(self)."""
 | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  |         raise NotImplementedError | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @abstractmethod | 
					
						
							|  |  |  |     def __trunc__(self): | 
					
						
							| 
									
										
										
										
											2007-09-07 15:15:49 +00:00
										 |  |  |         """trunc(self): Truncates self to an Integral.
 | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         Returns an Integral i such that: | 
					
						
							| 
									
										
										
										
											2007-12-06 17:45:33 +00:00
										 |  |  |           * i>0 iff self>0; | 
					
						
							|  |  |  |           * abs(i) <= abs(self); | 
					
						
							|  |  |  |           * for any Integral j satisfying the first two conditions, | 
					
						
							|  |  |  |             abs(i) >= abs(j) [i.e. i has "maximal" abs among those]. | 
					
						
							|  |  |  |         i.e. "truncate towards 0". | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         raise NotImplementedError | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @abstractmethod | 
					
						
							|  |  |  |     def __floor__(self): | 
					
						
							|  |  |  |         """Finds the greatest Integral <= self.""" | 
					
						
							|  |  |  |         raise NotImplementedError | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @abstractmethod | 
					
						
							|  |  |  |     def __ceil__(self): | 
					
						
							|  |  |  |         """Finds the least Integral >= self.""" | 
					
						
							|  |  |  |         raise NotImplementedError | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @abstractmethod | 
					
						
							| 
									
										
										
										
											2011-01-12 20:52:39 +00:00
										 |  |  |     def __round__(self, ndigits=None): | 
					
						
							| 
									
										
										
										
											2007-12-06 17:45:33 +00:00
										 |  |  |         """Rounds self to ndigits decimal places, defaulting to 0.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         If ndigits is omitted or None, returns an Integral, otherwise | 
					
						
							|  |  |  |         returns a Real. Rounds half toward even. | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  |         """
 | 
					
						
							|  |  |  |         raise NotImplementedError | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __divmod__(self, other): | 
					
						
							| 
									
										
										
										
											2007-09-07 15:15:49 +00:00
										 |  |  |         """divmod(self, other): The pair (self // other, self % other).
 | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         Sometimes this can be computed faster than the pair of | 
					
						
							|  |  |  |         operations. | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         return (self // other, self % other) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __rdivmod__(self, other): | 
					
						
							| 
									
										
										
										
											2007-09-07 15:15:49 +00:00
										 |  |  |         """divmod(other, self): The pair (self // other, self % other).
 | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         Sometimes this can be computed faster than the pair of | 
					
						
							|  |  |  |         operations. | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         return (other // self, other % self) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @abstractmethod | 
					
						
							|  |  |  |     def __floordiv__(self, other): | 
					
						
							| 
									
										
										
										
											2007-09-07 15:15:49 +00:00
										 |  |  |         """self // other: The floor() of self/other.""" | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  |         raise NotImplementedError | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @abstractmethod | 
					
						
							|  |  |  |     def __rfloordiv__(self, other): | 
					
						
							| 
									
										
										
										
											2007-09-07 15:15:49 +00:00
										 |  |  |         """other // self: The floor() of other/self.""" | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  |         raise NotImplementedError | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @abstractmethod | 
					
						
							|  |  |  |     def __mod__(self, other): | 
					
						
							| 
									
										
										
										
											2007-09-07 15:15:49 +00:00
										 |  |  |         """self % other""" | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  |         raise NotImplementedError | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @abstractmethod | 
					
						
							|  |  |  |     def __rmod__(self, other): | 
					
						
							| 
									
										
										
										
											2007-09-07 15:15:49 +00:00
										 |  |  |         """other % self""" | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  |         raise NotImplementedError | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @abstractmethod | 
					
						
							|  |  |  |     def __lt__(self, other): | 
					
						
							| 
									
										
										
										
											2007-09-07 15:15:49 +00:00
										 |  |  |         """self < other
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         < on Reals defines a total ordering, except perhaps for NaN."""
 | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  |         raise NotImplementedError | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-07 15:15:49 +00:00
										 |  |  |     @abstractmethod | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  |     def __le__(self, other): | 
					
						
							| 
									
										
										
										
											2007-09-07 15:15:49 +00:00
										 |  |  |         """self <= other""" | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  |         raise NotImplementedError | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Concrete implementations of Complex abstract methods. | 
					
						
							|  |  |  |     def __complex__(self): | 
					
						
							| 
									
										
										
										
											2007-09-07 15:15:49 +00:00
										 |  |  |         """complex(self) == complex(float(self), 0)""" | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  |         return complex(float(self)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @property | 
					
						
							|  |  |  |     def real(self): | 
					
						
							| 
									
										
										
										
											2007-09-07 15:15:49 +00:00
										 |  |  |         """Real numbers are their real component.""" | 
					
						
							| 
									
										
										
										
											2007-12-06 17:45:33 +00:00
										 |  |  |         return +self | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     @property | 
					
						
							|  |  |  |     def imag(self): | 
					
						
							| 
									
										
										
										
											2007-09-07 15:15:49 +00:00
										 |  |  |         """Real numbers have no imaginary component.""" | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  |         return 0 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def conjugate(self): | 
					
						
							|  |  |  |         """Conjugate is a no-op for Reals.""" | 
					
						
							| 
									
										
										
										
											2007-12-06 17:45:33 +00:00
										 |  |  |         return +self | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | Real.register(float) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-03-16 00:32:36 +00:00
										 |  |  | class Rational(Real): | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  |     """.numerator and .denominator should be in lowest terms.""" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-12 17:58:36 +00:00
										 |  |  |     __slots__ = () | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-15 15:34:02 -05:00
										 |  |  |     @property | 
					
						
							|  |  |  |     @abstractmethod | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  |     def numerator(self): | 
					
						
							|  |  |  |         raise NotImplementedError | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-15 15:34:02 -05:00
										 |  |  |     @property | 
					
						
							|  |  |  |     @abstractmethod | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  |     def denominator(self): | 
					
						
							|  |  |  |         raise NotImplementedError | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Concrete implementation of Real's conversion to float. | 
					
						
							|  |  |  |     def __float__(self): | 
					
						
							| 
									
										
										
										
											2008-01-31 14:31:45 +00:00
										 |  |  |         """float(self) = self.numerator / self.denominator
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         It's important that this conversion use the integer's "true" | 
					
						
							|  |  |  |         division rather than casting one side to float before dividing | 
					
						
							|  |  |  |         so that ratios of huge integers convert without overflowing. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  |         return self.numerator / self.denominator | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Integral(Rational): | 
					
						
							|  |  |  |     """Integral adds a conversion to int and the bit-string operations.""" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-12 17:58:36 +00:00
										 |  |  |     __slots__ = () | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  |     @abstractmethod | 
					
						
							|  |  |  |     def __int__(self): | 
					
						
							| 
									
										
										
										
											2007-09-07 15:15:49 +00:00
										 |  |  |         """int(self)""" | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  |         raise NotImplementedError | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __index__(self): | 
					
						
							| 
									
										
										
										
											2011-11-03 04:34:09 +01:00
										 |  |  |         """Called whenever an index is needed, such as in slicing""" | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  |         return int(self) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @abstractmethod | 
					
						
							| 
									
										
										
										
											2007-09-07 15:15:49 +00:00
										 |  |  |     def __pow__(self, exponent, modulus=None): | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  |         """self ** exponent % modulus, but maybe faster.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-07 15:15:49 +00:00
										 |  |  |         Accept the modulus argument if you want to support the | 
					
						
							|  |  |  |         3-argument version of pow(). Raise a TypeError if exponent < 0 | 
					
						
							|  |  |  |         or any argument isn't Integral. Otherwise, just implement the | 
					
						
							|  |  |  |         2-argument version described in Complex. | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  |         """
 | 
					
						
							|  |  |  |         raise NotImplementedError | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @abstractmethod | 
					
						
							|  |  |  |     def __lshift__(self, other): | 
					
						
							| 
									
										
										
										
											2007-09-07 15:15:49 +00:00
										 |  |  |         """self << other""" | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  |         raise NotImplementedError | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @abstractmethod | 
					
						
							|  |  |  |     def __rlshift__(self, other): | 
					
						
							| 
									
										
										
										
											2007-09-07 15:15:49 +00:00
										 |  |  |         """other << self""" | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  |         raise NotImplementedError | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @abstractmethod | 
					
						
							|  |  |  |     def __rshift__(self, other): | 
					
						
							| 
									
										
										
										
											2007-09-07 15:15:49 +00:00
										 |  |  |         """self >> other""" | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  |         raise NotImplementedError | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @abstractmethod | 
					
						
							|  |  |  |     def __rrshift__(self, other): | 
					
						
							| 
									
										
										
										
											2007-09-07 15:15:49 +00:00
										 |  |  |         """other >> self""" | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  |         raise NotImplementedError | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @abstractmethod | 
					
						
							|  |  |  |     def __and__(self, other): | 
					
						
							| 
									
										
										
										
											2007-09-07 15:15:49 +00:00
										 |  |  |         """self & other""" | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  |         raise NotImplementedError | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @abstractmethod | 
					
						
							|  |  |  |     def __rand__(self, other): | 
					
						
							| 
									
										
										
										
											2007-09-07 15:15:49 +00:00
										 |  |  |         """other & self""" | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  |         raise NotImplementedError | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @abstractmethod | 
					
						
							|  |  |  |     def __xor__(self, other): | 
					
						
							| 
									
										
										
										
											2007-09-07 15:15:49 +00:00
										 |  |  |         """self ^ other""" | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  |         raise NotImplementedError | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @abstractmethod | 
					
						
							|  |  |  |     def __rxor__(self, other): | 
					
						
							| 
									
										
										
										
											2007-09-07 15:15:49 +00:00
										 |  |  |         """other ^ self""" | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  |         raise NotImplementedError | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @abstractmethod | 
					
						
							|  |  |  |     def __or__(self, other): | 
					
						
							| 
									
										
										
										
											2007-09-07 15:15:49 +00:00
										 |  |  |         """self | other""" | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  |         raise NotImplementedError | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @abstractmethod | 
					
						
							|  |  |  |     def __ror__(self, other): | 
					
						
							| 
									
										
										
										
											2007-09-07 15:15:49 +00:00
										 |  |  |         """other | self""" | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  |         raise NotImplementedError | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @abstractmethod | 
					
						
							|  |  |  |     def __invert__(self): | 
					
						
							| 
									
										
										
										
											2007-09-07 15:15:49 +00:00
										 |  |  |         """~self""" | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  |         raise NotImplementedError | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Concrete implementations of Rational and Real abstract methods. | 
					
						
							|  |  |  |     def __float__(self): | 
					
						
							| 
									
										
										
										
											2007-09-07 15:15:49 +00:00
										 |  |  |         """float(self) == float(int(self))""" | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  |         return float(int(self)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @property | 
					
						
							|  |  |  |     def numerator(self): | 
					
						
							| 
									
										
										
										
											2007-09-07 15:15:49 +00:00
										 |  |  |         """Integers are their own numerators.""" | 
					
						
							| 
									
										
										
										
											2007-12-06 17:45:33 +00:00
										 |  |  |         return +self | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     @property | 
					
						
							|  |  |  |     def denominator(self): | 
					
						
							| 
									
										
										
										
											2007-09-07 15:15:49 +00:00
										 |  |  |         """Integers have a denominator of 1.""" | 
					
						
							| 
									
										
										
										
											2007-08-30 17:45:54 +00:00
										 |  |  |         return 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Integral.register(int) |