From 9d752e749251fa26343bf72950be91cecb137ffd Mon Sep 17 00:00:00 2001 From: Michael Lee Date: Tue, 13 Sep 2016 22:30:49 -0700 Subject: [PATCH] Refine stubs for Python 2's decimal module The decimal module for Python 2 was relatively incomplete, unlike the decimal module for Python 3. This commit copies the relevant type signatures from Python 3's decimal module to Python 2's. There was a lot of code in both stubs and it wasn't clear to me if it was safe to merge the two modules together, so I refrained from doing so. --- stdlib/2.7/decimal.pyi | 242 +++++++++++++++++++++-------------------- 1 file changed, 126 insertions(+), 116 deletions(-) diff --git a/stdlib/2.7/decimal.pyi b/stdlib/2.7/decimal.pyi index ebb6635e08ce..db51fe9f7a9d 100644 --- a/stdlib/2.7/decimal.pyi +++ b/stdlib/2.7/decimal.pyi @@ -1,17 +1,22 @@ # Stubs for decimal (Python 2) -# -# NOTE: This dynamically typed stub was automatically generated by stubgen. -from typing import Any, SupportsAbs, SupportsFloat, SupportsInt +from typing import Any, Optional, Sequence, Tuple, Union, SupportsAbs, SupportsFloat, SupportsInt -ROUND_DOWN = ... # type: Any -ROUND_HALF_UP = ... # type: Any -ROUND_HALF_EVEN = ... # type: Any -ROUND_CEILING = ... # type: Any -ROUND_FLOOR = ... # type: Any -ROUND_UP = ... # type: Any -ROUND_HALF_DOWN = ... # type: Any -ROUND_05UP = ... # type: Any +_Decimal = Union[Decimal, int] + +DecimalTuple = NamedTuple('DecimalTuple', + [('sign', int), + ('digits', Sequence[int]), # TODO: Use Tuple[int, ...] + ('exponent', int)]) + +ROUND_DOWN = ... # type: str +ROUND_HALF_UP = ... # type: str +ROUND_HALF_EVEN = ... # type: str +ROUND_CEILING = ... # type: str +ROUND_FLOOR = ... # type: str +ROUND_UP = ... # type: str +ROUND_HALF_DOWN = ... # type: str +ROUND_05UP = ... # type: str class DecimalException(ArithmeticError): def handle(self, context, *args): ... @@ -40,120 +45,125 @@ class Overflow(Inexact, Rounded): ... class Underflow(Inexact, Rounded, Subnormal): ... -def setcontext(context): ... -def getcontext(): ... -def localcontext(ctx=None): ... +def setcontext(context: Context): ... +def getcontext() -> Context: ... +def localcontext(ctx: Optional[Context] = None) -> _ContextManager: ... class Decimal(SupportsAbs[Decimal], SupportsFloat, SupportsInt): - def __new__(cls, value=..., context=None): ... + def __init__(cls, value: Union[_Decimal, float, str, + Tuple[int, Sequence[int], int]] = ..., + context: Context = ...) -> None: ... @classmethod - def from_float(cls, f): ... - def __nonzero__(self): ... - def __eq__(self, other, context=None): ... - def __ne__(self, other, context=None): ... - def __lt__(self, other, context=None): ... - def __le__(self, other, context=None): ... - def __gt__(self, other, context=None): ... - def __ge__(self, other, context=None): ... - def compare(self, other, context=None): ... - def __hash__(self): ... - def as_tuple(self): ... - def to_eng_string(self, context=None): ... - def __neg__(self, context=None): ... - def __pos__(self, context=None): ... - def __abs__(self, round=True, context=None): ... - def __add__(self, other, context=None): ... - def __radd__(self, other, context=None): ... - def __sub__(self, other, context=None): ... - def __rsub__(self, other, context=None): ... - def __mul__(self, other, context=None): ... - def __rmul__(self, other, context=None): ... - def __truediv__(self, other, context=None): ... - def __rtruediv__(self, other, context=None): ... - def __div__(self, other, context=None): ... - def __rdiv__(self, other, context=None): ... - def __divmod__(self, other, context=None): ... - def __rdivmod__(self, other, context=None): ... - def __mod__(self, other, context=None): ... - def __rmod__(self, other, context=None): ... - def remainder_near(self, other, context=None): ... - def __floordiv__(self, other, context=None): ... - def __rfloordiv__(self, other, context=None): ... - def __float__(self): ... - def __int__(self): ... - def __trunc__(self): ... - real = ... # type: property - imag = ... # type: property - def conjugate(self): ... - def __complex__(self): ... - def __long__(self): ... - def fma(self, other, third, context=None): ... - def __pow__(self, other, modulo=None, context=None): ... - def __rpow__(self, other, context=None): ... - def normalize(self, context=None): ... - def quantize(self, exp, rounding=None, context=None, watchexp=True): ... - def same_quantum(self, other): ... - def to_integral_exact(self, rounding=None, context=None): ... - def to_integral_value(self, rounding=None, context=None): ... - def to_integral(self, rounding=None, context=None): ... - def sqrt(self, context=None): ... - def max(self, other, context=None): ... - def min(self, other, context=None): ... - def adjusted(self): ... - def canonical(self, context=None): ... - def compare_signal(self, other, context=None): ... - def compare_total(self, other): ... - def compare_total_mag(self, other): ... - def copy_abs(self): ... - def copy_negate(self): ... - def copy_sign(self, other): ... - def exp(self, context=None): ... - def is_canonical(self): ... - def is_finite(self): ... - def is_infinite(self): ... - def is_nan(self): ... - def is_normal(self, context=None): ... - def is_qnan(self): ... - def is_signed(self): ... - def is_snan(self): ... - def is_subnormal(self, context=None): ... - def is_zero(self): ... - def ln(self, context=None): ... - def log10(self, context=None): ... - def logb(self, context=None): ... - def logical_and(self, other, context=None): ... - def logical_invert(self, context=None): ... - def logical_or(self, other, context=None): ... - def logical_xor(self, other, context=None): ... - def max_mag(self, other, context=None): ... - def min_mag(self, other, context=None): ... - def next_minus(self, context=None): ... - def next_plus(self, context=None): ... - def next_toward(self, other, context=None): ... - def number_class(self, context=None): ... - def radix(self): ... - def rotate(self, other, context=None): ... - def scaleb(self, other, context=None): ... - def shift(self, other, context=None): ... + def from_float(cls, f: float) -> Decimal: ... + def __nonzero__(self) -> bool: ... + def __eq__(self, other: object) -> bool: ... + def __ne__(self, other: object) -> bool: ... + def __lt__(self, other: _Decimal) -> bool: ... + def __le__(self, other: _Decimal) -> bool: ... + def __gt__(self, other: _Decimal) -> bool: ... + def __ge__(self, other: _Decimal) -> bool: ... + def compare(self, other: _Decimal) -> int: ... + def __hash__(self) -> int: ... + def as_tuple(self) -> DecimalTuple: ... + def to_eng_string(self, context: Context = ...) -> str: ... + def __neg__(self) -> Decimal: ... + def __pos__(self) -> Decimal: ... + def __abs__(self, round: bool = True) -> Decimal: ... + def __add__(self, other: _Decimal) -> Decimal: ... + def __radd__(self, other: _Decimal) -> Decimal: ... + def __sub__(self, other: _Decimal) -> Decimal: ... + def __rsub__(self, other: _Decimal) -> Decimal: ... + def __mul__(self, other: _Decimal) -> Decimal: ... + def __rmul__(self, other: _Decimal) -> Decimal: ... + def __truediv__(self, other: _Decimal) -> Decimal: ... + def __rtruediv__(self, other: _Decimal) -> Decimal: ... + def __div__(self, other: _Decimal) -> Decimal: ... + def __rdiv__(self, other: _Decimal) -> Decimal: ... + def __divmod__(self, other: _Decimal) -> Decimal: ... + def __rdivmod__(self, other: _Decimal) -> Decimal: ... + def __mod__(self, other: _Decimal) -> Decimal: ... + def __rmod__(self, other: _Decimal) -> Decimal: ... + def remainder_near(self, other: _Decimal, context: Context = ...) -> Decimal: ... + def __floordiv__(self, other: _Decimal) -> Decimal: ... + def __rfloordiv__(self, other: _Decimal) -> Decimal: ... + def __float__(self) -> float: ... + def __int__(self) -> int: ... + def __trunc__(self) -> int: ... + @property + def imag(self) -> Decimal: ... + @property + def real(self) -> Decimal: ... + def conjugate(self) -> Decimal: ... + def __complex__(self) -> complex: ... + def __long__(self) -> long: ... + def fma(self, other: _Decimal, third: _Decimal, context: Context = ...) -> Decimal: ... + def __pow__(self, other: _Decimal) -> Decimal: ... + def __rpow__(self, other: int) -> Decimal: ... + def normalize(self, context: Context = ...) -> Decimal: ... + def quantize(self, exp: _Decimal, rounding: str = ..., + context: Context = ...) -> Decimal: ... + def same_quantum(self, other: Decimal) -> bool: ... + def to_integral(self, rounding: str = ..., context: Context = ...) -> Decimal: ... + def to_integral_exact(self, rounding: str = ..., context: Context = ...) -> Decimal: ... + def to_integral_value(self, rounding: str = ..., context: Context = ...) -> Decimal: ... + def sqrt(self, context: Context = ...) -> Decimal: ... + def max(self, other: _Decimal, context: Context = ...) -> Decimal: ... + def min(self, other: _Decimal, context: Context = ...) -> Decimal: ... + def adjusted(self) -> int: ... + def canonical(self, context: Context = ...) -> Decimal: ... + def compare_signal(self, other: _Decimal, context: Context = ...) -> Decimal: ... + def compare_total(self, other: _Decimal) -> Decimal: ... + def compare_total_mag(self, other: _Decimal) -> Decimal: ... + def copy_abs(self) -> Decimal: ... + def copy_negate(self) -> Decimal: ... + def copy_sign(self, other: _Decimal) -> Decimal: ... + def exp(self, context: Context = ...) -> Decimal: ... + def is_canonical(self) -> bool: ... + def is_finite(self) -> bool: ... + def is_infinite(self) -> bool: ... + def is_nan(self) -> bool: ... + def is_normal(self, context: Context = ...) -> bool: ... + def is_qnan(self) -> bool: ... + def is_signed(self) -> bool: ... + def is_snan(self) -> bool: ... + def is_subnormal(self, context: Context = ...) -> bool: ... + def is_zero(self) -> bool: ... + def ln(self, context: Context = ...) -> Decimal: ... + def log10(self, context: Context = ...) -> Decimal: ... + def logb(self, context: Context = ...) -> Decimal: ... + def logical_and(self, other: _Decimal, context: Context = ...) -> Decimal: ... + def logical_invert(self, context: Context = ...) -> Decimal: ... + def logical_or(self, other: _Decimal, context: Context = ...) -> Decimal: ... + def logical_xor(self, other: _Decimal, context: Context = ...) -> Decimal: ... + def max_mag(self, other: _Decimal, context: Context = ...) -> Decimal: ... + def min_mag(self, other: _Decimal, context: Context = ...) -> Decimal: ... + def next_minus(self, context: Context = ...) -> Decimal: ... + def next_plus(self, context: Context = ...) -> Decimal: ... + def next_toward(self, other: _Decimal, context: Context = ...) -> Decimal: ... + def number_class(self, context: Context = ...) -> str: ... + def radix(self) -> Decimal: ... + def rotate(self, other: _Decimal, context: Context = ...) -> Decimal: ... + def scaleb(self, other: _Decimal, context: Context = ...) -> Decimal: ... + def shift(self, other: _Decimal, context: Context = ...) -> Decimal: ... def __reduce__(self): ... def __copy__(self): ... def __deepcopy__(self, memo): ... - def __format__(self, specifier, context=None, _localeconv=None): ... + def __format__(self, specifier, context=None, _localeconv=None) -> str: ... class _ContextManager: - new_context = ... # type: Any - def __init__(self, new_context): ... - saved_context = ... # type: Any + new_context = ... # type: Context + saved_context = ... # type: Context + def __init__(self, new_context: Context) -> None: ... def __enter__(self): ... def __exit__(self, t, v, tb): ... class Context: - prec = ... # type: Any - rounding = ... # type: Any - Emin = ... # type: Any - Emax = ... # type: Any - capitals = ... # type: Any - traps = ... # type: Any + prec = ... # type: int + rounding = ... # type: str + Emin = ... # type: int + Emax = ... # type: int + capitals = ... # type: int + traps = ... # type: Dict[type, bool] flags = ... # type: Any def __init__(self, prec=None, rounding=None, traps=None, flags=None, Emin=None, Emax=None, capitals=None, _clamp=0, _ignored_flags=None): ... def clear_flags(self): ... @@ -226,6 +236,6 @@ class Context: def to_integral_value(self, a): ... def to_integral(self, a): ... -DefaultContext = ... # type: Any -BasicContext = ... # type: Any -ExtendedContext = ... # type: Any +DefaultContext = ... # type: Context +BasicContext = ... # type: Context +ExtendedContext = ... # type: Context