Constructs a Rational. Takes a string like '3/2' or '1.5', another Rational instance, a numerator/denominator pair, or a float. Examples -------- >>> Fraction(10, -8) Fraction(-5, 4) >>> Fraction(Fraction(1, 7), 5) Fraction(1, 35)
(cls, numerator=0, denominator=None)
| 204 | |
| 205 | # We're immutable, so use __new__ not __init__ |
| 206 | def __new__(cls, numerator=0, denominator=None): |
| 207 | """Constructs a Rational. |
| 208 | |
| 209 | Takes a string like '3/2' or '1.5', another Rational instance, a |
| 210 | numerator/denominator pair, or a float. |
| 211 | |
| 212 | Examples |
| 213 | -------- |
| 214 | |
| 215 | >>> Fraction(10, -8) |
| 216 | Fraction(-5, 4) |
| 217 | >>> Fraction(Fraction(1, 7), 5) |
| 218 | Fraction(1, 35) |
| 219 | >>> Fraction(Fraction(1, 7), Fraction(2, 3)) |
| 220 | Fraction(3, 14) |
| 221 | >>> Fraction('314') |
| 222 | Fraction(314, 1) |
| 223 | >>> Fraction('-35/4') |
| 224 | Fraction(-35, 4) |
| 225 | >>> Fraction('3.1415') # conversion from numeric string |
| 226 | Fraction(6283, 2000) |
| 227 | >>> Fraction('-47e-2') # string may include a decimal exponent |
| 228 | Fraction(-47, 100) |
| 229 | >>> Fraction(1.47) # direct construction from float (exact conversion) |
| 230 | Fraction(6620291452234629, 4503599627370496) |
| 231 | >>> Fraction(2.25) |
| 232 | Fraction(9, 4) |
| 233 | >>> Fraction(Decimal('1.47')) |
| 234 | Fraction(147, 100) |
| 235 | |
| 236 | """ |
| 237 | self = super(Fraction, cls).__new__(cls) |
| 238 | |
| 239 | if denominator is None: |
| 240 | if type(numerator) is int: |
| 241 | self._numerator = numerator |
| 242 | self._denominator = 1 |
| 243 | return self |
| 244 | |
| 245 | elif (isinstance(numerator, float) or |
| 246 | (not isinstance(numerator, type) and |
| 247 | hasattr(numerator, 'as_integer_ratio'))): |
| 248 | # Exact conversion |
| 249 | self._numerator, self._denominator = numerator.as_integer_ratio() |
| 250 | return self |
| 251 | |
| 252 | elif isinstance(numerator, str): |
| 253 | # Handle construction from strings. |
| 254 | m = _RATIONAL_FORMAT.match(numerator) |
| 255 | if m is None: |
| 256 | raise ValueError('Invalid literal for Fraction: %r' % |
| 257 | numerator) |
| 258 | numerator = int(m.group('num') or '0') |
| 259 | denom = m.group('denom') |
| 260 | if denom: |
| 261 | denominator = int(denom) |
| 262 | else: |
| 263 | denominator = 1 |
no test coverage detected