gh-73487: Convert _decimal to use Argument Clinic (part 6) (GH-138015)

This commit is contained in:
Sergey B Kirpichev 2025-08-28 13:36:00 +03:00 committed by GitHub
parent f914e0ab09
commit ef4dd1d655
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 658 additions and 236 deletions

View file

@ -3357,7 +3357,7 @@ MODULE_UNICODEDATA_DEPS=$(srcdir)/Modules/unicodedata_db.h $(srcdir)/Modules/uni
MODULE__CTYPES_DEPS=$(srcdir)/Modules/_ctypes/ctypes.h
MODULE__CTYPES_TEST_DEPS=$(srcdir)/Modules/_ctypes/_ctypes_test_generated.c.h
MODULE__CTYPES_MALLOC_CLOSURE=@MODULE__CTYPES_MALLOC_CLOSURE@
MODULE__DECIMAL_DEPS=$(srcdir)/Modules/_decimal/docstrings.h @LIBMPDEC_INTERNAL@
MODULE__DECIMAL_DEPS=@LIBMPDEC_INTERNAL@
MODULE__ELEMENTTREE_DEPS=$(srcdir)/Modules/pyexpat.c @LIBEXPAT_INTERNAL@
MODULE__HASHLIB_DEPS=$(srcdir)/Modules/hashlib.h
MODULE__IO_DEPS=$(srcdir)/Modules/_io/_iomodule.h

View file

@ -50,8 +50,6 @@
#include <ctype.h> // isascii()
#include <stdlib.h>
#include "docstrings.h"
#ifdef EXTRA_FUNCTIONALITY
#define _PY_DEC_ROUND_GUARD MPD_ROUND_GUARD
#else
@ -1390,15 +1388,29 @@ context_setattrs(PyObject *self, PyObject *prec, PyObject *rounding,
return 0;
}
/*[clinic input]
_decimal.Context.clear_traps
Set all traps to False.
[clinic start generated code]*/
static PyObject *
context_clear_traps(PyObject *self, PyObject *Py_UNUSED(dummy))
_decimal_Context_clear_traps_impl(PyObject *self)
/*[clinic end generated code: output=b47cfa6e32407d40 input=3872e80637148035]*/
{
CTX(self)->traps = 0;
Py_RETURN_NONE;
}
/*[clinic input]
_decimal.Context.clear_flags
Reset all flags to False.
[clinic start generated code]*/
static PyObject *
context_clear_flags(PyObject *self, PyObject *Py_UNUSED(dummy))
_decimal_Context_clear_flags_impl(PyObject *self)
/*[clinic end generated code: output=c86719a70177d0b6 input=a06055e2f3e7edb1]*/
{
CTX(self)->status = 0;
Py_RETURN_NONE;
@ -1496,32 +1508,37 @@ context_dealloc(PyObject *self)
Py_DECREF(tp);
}
/*[clinic input]
_decimal.Context.__init__ as context_init
prec: object = None
rounding: object = None
Emin as emin: object = None
Emax as emax: object = None
capitals: object = None
clamp: object = None
flags as status: object = None
traps: object = None
Create context.
The context affects almost all operations and controls rounding,
Over/Underflow, raising of exceptions and much more. A new context
can be constructed as follows:
>>> c = Context(prec=28, Emin=-425000000, Emax=425000000,
... rounding=ROUND_HALF_EVEN, capitals=1, clamp=1,
... traps=[InvalidOperation, DivisionByZero, Overflow],
... flags=[])
>>>
[clinic start generated code]*/
static int
context_init(PyObject *self, PyObject *args, PyObject *kwds)
context_init_impl(PyObject *self, PyObject *prec, PyObject *rounding,
PyObject *emin, PyObject *emax, PyObject *capitals,
PyObject *clamp, PyObject *status, PyObject *traps)
/*[clinic end generated code: output=8bfdc59fbe862f44 input=45c704b93cd02959]*/
{
static char *kwlist[] = {
"prec", "rounding", "Emin", "Emax", "capitals", "clamp",
"flags", "traps", NULL
};
PyObject *prec = Py_None;
PyObject *rounding = Py_None;
PyObject *emin = Py_None;
PyObject *emax = Py_None;
PyObject *capitals = Py_None;
PyObject *clamp = Py_None;
PyObject *status = Py_None;
PyObject *traps = Py_None;
assert(PyTuple_Check(args));
if (!PyArg_ParseTupleAndKeywords(
args, kwds,
"|OOOOOOOO", kwlist,
&prec, &rounding, &emin, &emax, &capitals, &clamp, &status, &traps
)) {
return -1;
}
return context_setattrs(
self, prec, rounding,
emin, emax, capitals,
@ -1631,8 +1648,15 @@ _decimal_IEEEContext_impl(PyObject *module, Py_ssize_t bits)
return NULL;
}
/*[clinic input]
_decimal.Context.copy
Return a duplicate of the context with all flags cleared.
[clinic start generated code]*/
static PyObject *
context_copy(PyObject *self, PyObject *Py_UNUSED(dummy))
_decimal_Context_copy_impl(PyObject *self)
/*[clinic end generated code: output=f99649a60a9c10f8 input=2589aa46b77cbc28]*/
{
PyObject *copy;
@ -1649,6 +1673,12 @@ context_copy(PyObject *self, PyObject *Py_UNUSED(dummy))
return copy;
}
static PyObject *
context_copy(PyObject *self, PyObject *Py_UNUSED(dummy))
{
return _decimal_Context_copy_impl(self);
}
static PyObject *
context_reduce(PyObject *self, PyObject *Py_UNUSED(dummy))
{
@ -3048,11 +3078,26 @@ _decimal_Decimal_from_number_impl(PyTypeObject *type, PyObject *number)
}
/* create_decimal_from_float */
/*[clinic input]
_decimal.Context.create_decimal_from_float
self as context: self
f: object
/
Create a new Decimal instance from float f.
Unlike the Decimal.from_float() class method, this function observes
the context limits.
[clinic start generated code]*/
static PyObject *
ctx_from_float(PyObject *context, PyObject *v)
_decimal_Context_create_decimal_from_float(PyObject *context, PyObject *f)
/*[clinic end generated code: output=c660c343f6f7158b input=05a8c54b7a5b457b]*/
{
decimal_state *state = get_module_state_from_ctx(context);
return PyDec_FromFloat(state, v, context);
return PyDec_FromFloat(state, f, context);
}
/* Apply the context to the input operand. Return a new PyDecObject. */
@ -3194,16 +3239,24 @@ dec_new_impl(PyTypeObject *type, PyObject *value, PyObject *context)
return PyDecType_FromObjectExact(type, value, context);
}
/*[clinic input]
_decimal.Context.create_decimal
self as context: self
num: object(c_default="NULL") = "0"
/
Create a new Decimal instance from num, using self as the context.
Unlike the Decimal constructor, this function observes the context
limits.
[clinic start generated code]*/
static PyObject *
ctx_create_decimal(PyObject *context, PyObject *args)
_decimal_Context_create_decimal_impl(PyObject *context, PyObject *num)
/*[clinic end generated code: output=85e08ae02f3b34da input=d2c4946cf7804fbe]*/
{
PyObject *v = NULL;
if (!PyArg_ParseTuple(args, "|O", &v)) {
return NULL;
}
return PyDec_FromObject(v, context);
return PyDec_FromObject(num, context);
}
@ -6503,20 +6556,27 @@ _decimal_Context_subtract_impl(PyObject *context, PyObject *x, PyObject *y)
/*[clinic end generated code: output=fa8847e07b7c2bcc input=6767683ec68f7a1a]*/
DecCtx_BinaryFunc(mpd_qsub)
/*[clinic input]
_decimal.Context.divmod
self as context: self
x: object
y: object
/
Return quotient and remainder of the division x / y.
[clinic start generated code]*/
static PyObject *
ctx_mpd_qdivmod(PyObject *context, PyObject *args)
_decimal_Context_divmod_impl(PyObject *context, PyObject *x, PyObject *y)
/*[clinic end generated code: output=5dbf5410e3f302af input=4d8eee07823c752a]*/
{
PyObject *v, *w;
PyObject *a, *b;
PyObject *q, *r;
uint32_t status = 0;
PyObject *ret;
if (!PyArg_ParseTuple(args, "OO", &v, &w)) {
return NULL;
}
CONVERT_BINOP_RAISE(&a, &b, v, w, context);
CONVERT_BINOP_RAISE(&a, &b, x, y, context);
decimal_state *state = get_module_state_from_ctx(context);
q = dec_alloc(state);
if (q == NULL) {
@ -6764,52 +6824,95 @@ _decimal_Context_is_zero(PyObject *context, PyObject *x)
/*[clinic end generated code: output=24150f3c2422ebf8 input=bf08197d142a8027]*/
DecCtx_BoolFunc_NO_CTX(mpd_iszero)
/*[clinic input]
_decimal.Context.is_canonical = _decimal.Context.is_normal
Return True if x is canonical, False otherwise.
[clinic start generated code]*/
static PyObject *
ctx_iscanonical(PyObject *context, PyObject *v)
_decimal_Context_is_canonical(PyObject *context, PyObject *x)
/*[clinic end generated code: output=b5b522b930a41186 input=1bf2129808e55eb9]*/
{
decimal_state *state = get_module_state_from_ctx(context);
if (!PyDec_Check(state, v)) {
if (!PyDec_Check(state, x)) {
PyErr_SetString(PyExc_TypeError,
"argument must be a Decimal");
return NULL;
}
return mpd_iscanonical(MPD(v)) ? incr_true() : incr_false();
return mpd_iscanonical(MPD(x)) ? incr_true() : incr_false();
}
/* Functions with a single decimal argument */
/*[clinic input]
_decimal.Context._apply = _decimal.Context.is_normal
Apply self to Decimal x.
[clinic start generated code]*/
static PyObject *
PyDecContext_Apply(PyObject *context, PyObject *v)
_decimal_Context__apply(PyObject *context, PyObject *x)
/*[clinic end generated code: output=8db39d294602492e input=12b34468ca4a4c30]*/
{
PyObject *result, *a;
CONVERT_OP_RAISE(&a, v, context);
CONVERT_OP_RAISE(&a, x, context);
result = dec_apply(a, context);
Py_DECREF(a);
return result;
}
#ifdef EXTRA_FUNCTIONALITY
/*[clinic input]
_decimal.Context.apply = _decimal.Context._apply
Apply self to Decimal x.
[clinic start generated code]*/
static PyObject *
ctx_canonical(PyObject *context, PyObject *v)
_decimal_Context_apply(PyObject *context, PyObject *x)
/*[clinic end generated code: output=4d39653645a6df44 input=388e66ca82733516]*/
{
return _decimal_Context__apply(context, v);
}
#endif
/*[clinic input]
_decimal.Context.canonical = _decimal.Context.is_normal
Return a new instance of x.
[clinic start generated code]*/
static PyObject *
_decimal_Context_canonical(PyObject *context, PyObject *x)
/*[clinic end generated code: output=28fa845499e5d485 input=025ecb106ac15bff]*/
{
decimal_state *state = get_module_state_from_ctx(context);
if (!PyDec_Check(state, v)) {
if (!PyDec_Check(state, x)) {
PyErr_SetString(PyExc_TypeError,
"argument must be a Decimal");
return NULL;
}
return Py_NewRef(v);
return Py_NewRef(x);
}
/*[clinic input]
_decimal.Context.copy_abs = _decimal.Context.is_normal
Return a copy of x with the sign set to 0.
[clinic start generated code]*/
static PyObject *
ctx_mpd_qcopy_abs(PyObject *context, PyObject *v)
_decimal_Context_copy_abs(PyObject *context, PyObject *x)
/*[clinic end generated code: output=a9035e6606261b30 input=4aa2f612625f0f73]*/
{
PyObject *result, *a;
uint32_t status = 0;
CONVERT_OP_RAISE(&a, v, context);
CONVERT_OP_RAISE(&a, x, context);
decimal_state *state = get_module_state_from_ctx(context);
result = dec_alloc(state);
if (result == NULL) {
@ -6827,22 +6930,36 @@ ctx_mpd_qcopy_abs(PyObject *context, PyObject *v)
return result;
}
/*[clinic input]
_decimal.Context.copy_decimal = _decimal.Context.is_normal
Return a copy of Decimal x.
[clinic start generated code]*/
static PyObject *
ctx_copy_decimal(PyObject *context, PyObject *v)
_decimal_Context_copy_decimal(PyObject *context, PyObject *x)
/*[clinic end generated code: output=b9ec251a2a568a14 input=4db4f942f45fb7c9]*/
{
PyObject *result;
CONVERT_OP_RAISE(&result, v, context);
CONVERT_OP_RAISE(&result, x, context);
return result;
}
/*[clinic input]
_decimal.Context.copy_negate = _decimal.Context.is_normal
Return a copy of x with the sign inverted.
[clinic start generated code]*/
static PyObject *
ctx_mpd_qcopy_negate(PyObject *context, PyObject *v)
_decimal_Context_copy_negate(PyObject *context, PyObject *x)
/*[clinic end generated code: output=5fe136d7bac13391 input=2e6e213e2ed0efda]*/
{
PyObject *result, *a;
uint32_t status = 0;
CONVERT_OP_RAISE(&a, v, context);
CONVERT_OP_RAISE(&a, x, context);
decimal_state *state = get_module_state_from_ctx(context);
result = dec_alloc(state);
if (result == NULL) {
@ -6882,13 +6999,20 @@ _decimal_Context_logical_invert(PyObject *context, PyObject *x)
/*[clinic end generated code: output=b863a5cdb986f684 input=1fa8dcc59c557fcc]*/
DecCtx_UnaryFunc(mpd_qinvert)
/*[clinic input]
_decimal.Context.number_class = _decimal.Context.is_normal
Return an indication of the class of x.
[clinic start generated code]*/
static PyObject *
ctx_mpd_class(PyObject *context, PyObject *v)
_decimal_Context_number_class(PyObject *context, PyObject *x)
/*[clinic end generated code: output=2b39fa98dd723c6f input=1ead8462f1800e4e]*/
{
PyObject *a;
const char *cp;
CONVERT_OP_RAISE(&a, v, context);
CONVERT_OP_RAISE(&a, x, context);
cp = mpd_class(MPD(a), CTX(context));
Py_DECREF(a);
@ -6896,15 +7020,22 @@ ctx_mpd_class(PyObject *context, PyObject *v)
return PyUnicode_FromString(cp);
}
/*[clinic input]
_decimal.Context.to_sci_string = _decimal.Context.is_normal
Convert a number to a string using scientific notation.
[clinic start generated code]*/
static PyObject *
ctx_mpd_to_sci(PyObject *context, PyObject *v)
_decimal_Context_to_sci_string(PyObject *context, PyObject *x)
/*[clinic end generated code: output=7d461d24824c6f15 input=ed442677c66d342d]*/
{
PyObject *result;
PyObject *a;
mpd_ssize_t size;
char *s;
CONVERT_OP_RAISE(&a, v, context);
CONVERT_OP_RAISE(&a, x, context);
size = mpd_to_sci_size(&s, MPD(a), CtxCaps(context));
Py_DECREF(a);
@ -6919,15 +7050,22 @@ ctx_mpd_to_sci(PyObject *context, PyObject *v)
return result;
}
/*[clinic input]
_decimal.Context.to_eng_string = _decimal.Context.is_normal
Convert a number to a string, using engineering notation.
[clinic start generated code]*/
static PyObject *
ctx_mpd_to_eng(PyObject *context, PyObject *v)
_decimal_Context_to_eng_string(PyObject *context, PyObject *x)
/*[clinic end generated code: output=3a54b9de0b01708f input=a574385e2e3e3bc0]*/
{
PyObject *result;
PyObject *a;
mpd_ssize_t size;
char *s;
CONVERT_OP_RAISE(&a, v, context);
CONVERT_OP_RAISE(&a, x, context);
size = mpd_to_eng_size(&s, MPD(a), CtxCaps(context));
Py_DECREF(a);
@ -6973,19 +7111,21 @@ _decimal_Context_compare_total_mag_impl(PyObject *context, PyObject *x,
/*[clinic end generated code: output=7c376de9f94feeaf input=2b982e69f932dcb2]*/
DecCtx_BinaryFunc_NO_CTX(mpd_compare_total_mag)
/*[clinic input]
_decimal.Context.copy_sign = _decimal.Context.compare_total
Copy the sign from y to x.
[clinic start generated code]*/
static PyObject *
ctx_mpd_qcopy_sign(PyObject *context, PyObject *args)
_decimal_Context_copy_sign_impl(PyObject *context, PyObject *x, PyObject *y)
/*[clinic end generated code: output=fff3c5c474acf78e input=c0682aeaffc7cfdf]*/
{
PyObject *v, *w;
PyObject *a, *b;
PyObject *result;
uint32_t status = 0;
if (!PyArg_ParseTuple(args, "OO", &v, &w)) {
return NULL;
}
CONVERT_BINOP_RAISE(&a, &b, v, w, context);
CONVERT_BINOP_RAISE(&a, &b, x, y, context);
decimal_state *state = get_module_state_from_ctx(context);
result = dec_alloc(state);
if (result == NULL) {
@ -7073,18 +7213,21 @@ _decimal_Context_shift_impl(PyObject *context, PyObject *x, PyObject *y)
/*[clinic end generated code: output=78625878a264b3e5 input=1ab44ff0854420ce]*/
DecCtx_BinaryFunc(mpd_qshift)
/*[clinic input]
_decimal.Context.same_quantum = _decimal.Context.add
Return True if the two operands have the same exponent.
[clinic start generated code]*/
static PyObject *
ctx_mpd_same_quantum(PyObject *context, PyObject *args)
_decimal_Context_same_quantum_impl(PyObject *context, PyObject *x,
PyObject *y)
/*[clinic end generated code: output=137acab27ece605c input=194cd156e398eaf9]*/
{
PyObject *v, *w;
PyObject *a, *b;
PyObject *result;
if (!PyArg_ParseTuple(args, "OO", &v, &w)) {
return NULL;
}
CONVERT_BINOP_RAISE(&a, &b, v, w, context);
CONVERT_BINOP_RAISE(&a, &b, x, y, context);
result = mpd_same_quantum(MPD(a), MPD(b)) ? incr_true() : incr_false();
Py_DECREF(a);
@ -7117,7 +7260,7 @@ static PyMethodDef context_methods [] =
_DECIMAL_CONTEXT_COMPARE_SIGNAL_METHODDEF
_DECIMAL_CONTEXT_DIVIDE_METHODDEF
_DECIMAL_CONTEXT_DIVIDE_INT_METHODDEF
{ "divmod", ctx_mpd_qdivmod, METH_VARARGS, doc_ctx_divmod },
_DECIMAL_CONTEXT_DIVMOD_METHODDEF
_DECIMAL_CONTEXT_MAX_METHODDEF
_DECIMAL_CONTEXT_MAX_MAG_METHODDEF
_DECIMAL_CONTEXT_MIN_METHODDEF
@ -7141,7 +7284,7 @@ static PyMethodDef context_methods [] =
_DECIMAL_CONTEXT_RADIX_METHODDEF
/* Boolean functions */
{ "is_canonical", ctx_iscanonical, METH_O, doc_ctx_is_canonical },
_DECIMAL_CONTEXT_IS_CANONICAL_METHODDEF
_DECIMAL_CONTEXT_IS_FINITE_METHODDEF
_DECIMAL_CONTEXT_IS_INFINITE_METHODDEF
_DECIMAL_CONTEXT_IS_NAN_METHODDEF
@ -7153,35 +7296,33 @@ static PyMethodDef context_methods [] =
_DECIMAL_CONTEXT_IS_ZERO_METHODDEF
/* Functions with a single decimal argument */
{ "_apply", PyDecContext_Apply, METH_O, NULL }, /* alias for apply */
#ifdef EXTRA_FUNCTIONALITY
{ "apply", PyDecContext_Apply, METH_O, doc_ctx_apply },
#endif
{ "canonical", ctx_canonical, METH_O, doc_ctx_canonical },
{ "copy_abs", ctx_mpd_qcopy_abs, METH_O, doc_ctx_copy_abs },
{ "copy_decimal", ctx_copy_decimal, METH_O, doc_ctx_copy_decimal },
{ "copy_negate", ctx_mpd_qcopy_negate, METH_O, doc_ctx_copy_negate },
_DECIMAL_CONTEXT__APPLY_METHODDEF
_DECIMAL_CONTEXT_APPLY_METHODDEF
_DECIMAL_CONTEXT_CANONICAL_METHODDEF
_DECIMAL_CONTEXT_COPY_ABS_METHODDEF
_DECIMAL_CONTEXT_COPY_DECIMAL_METHODDEF
_DECIMAL_CONTEXT_COPY_NEGATE_METHODDEF
_DECIMAL_CONTEXT_LOGB_METHODDEF
_DECIMAL_CONTEXT_LOGICAL_INVERT_METHODDEF
{ "number_class", ctx_mpd_class, METH_O, doc_ctx_number_class },
{ "to_sci_string", ctx_mpd_to_sci, METH_O, doc_ctx_to_sci_string },
{ "to_eng_string", ctx_mpd_to_eng, METH_O, doc_ctx_to_eng_string },
_DECIMAL_CONTEXT_NUMBER_CLASS_METHODDEF
_DECIMAL_CONTEXT_TO_SCI_STRING_METHODDEF
_DECIMAL_CONTEXT_TO_ENG_STRING_METHODDEF
/* Functions with two decimal arguments */
_DECIMAL_CONTEXT_COMPARE_TOTAL_METHODDEF
_DECIMAL_CONTEXT_COMPARE_TOTAL_MAG_METHODDEF
{ "copy_sign", ctx_mpd_qcopy_sign, METH_VARARGS, doc_ctx_copy_sign },
_DECIMAL_CONTEXT_COPY_SIGN_METHODDEF
_DECIMAL_CONTEXT_LOGICAL_AND_METHODDEF
_DECIMAL_CONTEXT_LOGICAL_OR_METHODDEF
_DECIMAL_CONTEXT_LOGICAL_XOR_METHODDEF
_DECIMAL_CONTEXT_ROTATE_METHODDEF
{ "same_quantum", ctx_mpd_same_quantum, METH_VARARGS, doc_ctx_same_quantum },
_DECIMAL_CONTEXT_SAME_QUANTUM_METHODDEF
_DECIMAL_CONTEXT_SCALEB_METHODDEF
_DECIMAL_CONTEXT_SHIFT_METHODDEF
/* Set context values */
{ "clear_flags", context_clear_flags, METH_NOARGS, doc_ctx_clear_flags },
{ "clear_traps", context_clear_traps, METH_NOARGS, doc_ctx_clear_traps },
_DECIMAL_CONTEXT_CLEAR_FLAGS_METHODDEF
_DECIMAL_CONTEXT_CLEAR_TRAPS_METHODDEF
#ifdef CONFIG_32
/* Unsafe set functions with relaxed range checks */
@ -7193,9 +7334,9 @@ static PyMethodDef context_methods [] =
/* Miscellaneous */
{ "__copy__", context_copy, METH_NOARGS, NULL },
{ "__reduce__", context_reduce, METH_NOARGS, NULL },
{ "copy", context_copy, METH_NOARGS, doc_ctx_copy },
{ "create_decimal", ctx_create_decimal, METH_VARARGS, doc_ctx_create_decimal },
{ "create_decimal_from_float", ctx_from_float, METH_O, doc_ctx_create_decimal_from_float },
_DECIMAL_CONTEXT_COPY_METHODDEF
_DECIMAL_CONTEXT_CREATE_DECIMAL_METHODDEF
_DECIMAL_CONTEXT_CREATE_DECIMAL_FROM_FLOAT_METHODDEF
{ NULL, NULL, 1 }
};
@ -7208,7 +7349,7 @@ static PyType_Slot context_slots[] = {
{Py_tp_repr, context_repr},
{Py_tp_getattro, context_getattr},
{Py_tp_setattro, context_setattr},
{Py_tp_doc, (void *)doc_context},
{Py_tp_doc, (void *)context_init__doc__},
{Py_tp_methods, context_methods},
{Py_tp_getset, context_getsets},
{Py_tp_init, context_init},

View file

@ -51,6 +51,166 @@ _decimal_Context_Etop(PyObject *self, PyObject *Py_UNUSED(ignored))
return _decimal_Context_Etop_impl(self);
}
PyDoc_STRVAR(_decimal_Context_clear_traps__doc__,
"clear_traps($self, /)\n"
"--\n"
"\n"
"Set all traps to False.");
#define _DECIMAL_CONTEXT_CLEAR_TRAPS_METHODDEF \
{"clear_traps", (PyCFunction)_decimal_Context_clear_traps, METH_NOARGS, _decimal_Context_clear_traps__doc__},
static PyObject *
_decimal_Context_clear_traps_impl(PyObject *self);
static PyObject *
_decimal_Context_clear_traps(PyObject *self, PyObject *Py_UNUSED(ignored))
{
return _decimal_Context_clear_traps_impl(self);
}
PyDoc_STRVAR(_decimal_Context_clear_flags__doc__,
"clear_flags($self, /)\n"
"--\n"
"\n"
"Reset all flags to False.");
#define _DECIMAL_CONTEXT_CLEAR_FLAGS_METHODDEF \
{"clear_flags", (PyCFunction)_decimal_Context_clear_flags, METH_NOARGS, _decimal_Context_clear_flags__doc__},
static PyObject *
_decimal_Context_clear_flags_impl(PyObject *self);
static PyObject *
_decimal_Context_clear_flags(PyObject *self, PyObject *Py_UNUSED(ignored))
{
return _decimal_Context_clear_flags_impl(self);
}
PyDoc_STRVAR(context_init__doc__,
"Context(prec=None, rounding=None, Emin=None, Emax=None, capitals=None,\n"
" clamp=None, flags=None, traps=None)\n"
"--\n"
"\n"
"Create context.\n"
"\n"
"The context affects almost all operations and controls rounding,\n"
"Over/Underflow, raising of exceptions and much more. A new context\n"
"can be constructed as follows:\n"
"\n"
" >>> c = Context(prec=28, Emin=-425000000, Emax=425000000,\n"
" ... rounding=ROUND_HALF_EVEN, capitals=1, clamp=1,\n"
" ... traps=[InvalidOperation, DivisionByZero, Overflow],\n"
" ... flags=[])\n"
" >>>");
static int
context_init_impl(PyObject *self, PyObject *prec, PyObject *rounding,
PyObject *emin, PyObject *emax, PyObject *capitals,
PyObject *clamp, PyObject *status, PyObject *traps);
static int
context_init(PyObject *self, PyObject *args, PyObject *kwargs)
{
int return_value = -1;
#if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
#define NUM_KEYWORDS 8
static struct {
PyGC_Head _this_is_not_used;
PyObject_VAR_HEAD
Py_hash_t ob_hash;
PyObject *ob_item[NUM_KEYWORDS];
} _kwtuple = {
.ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
.ob_hash = -1,
.ob_item = { &_Py_ID(prec), &_Py_ID(rounding), &_Py_ID(Emin), &_Py_ID(Emax), &_Py_ID(capitals), &_Py_ID(clamp), &_Py_ID(flags), &_Py_ID(traps), },
};
#undef NUM_KEYWORDS
#define KWTUPLE (&_kwtuple.ob_base.ob_base)
#else // !Py_BUILD_CORE
# define KWTUPLE NULL
#endif // !Py_BUILD_CORE
static const char * const _keywords[] = {"prec", "rounding", "Emin", "Emax", "capitals", "clamp", "flags", "traps", NULL};
static _PyArg_Parser _parser = {
.keywords = _keywords,
.fname = "Context",
.kwtuple = KWTUPLE,
};
#undef KWTUPLE
PyObject *argsbuf[8];
PyObject * const *fastargs;
Py_ssize_t nargs = PyTuple_GET_SIZE(args);
Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 0;
PyObject *prec = Py_None;
PyObject *rounding = Py_None;
PyObject *emin = Py_None;
PyObject *emax = Py_None;
PyObject *capitals = Py_None;
PyObject *clamp = Py_None;
PyObject *status = Py_None;
PyObject *traps = Py_None;
fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser,
/*minpos*/ 0, /*maxpos*/ 8, /*minkw*/ 0, /*varpos*/ 0, argsbuf);
if (!fastargs) {
goto exit;
}
if (!noptargs) {
goto skip_optional_pos;
}
if (fastargs[0]) {
prec = fastargs[0];
if (!--noptargs) {
goto skip_optional_pos;
}
}
if (fastargs[1]) {
rounding = fastargs[1];
if (!--noptargs) {
goto skip_optional_pos;
}
}
if (fastargs[2]) {
emin = fastargs[2];
if (!--noptargs) {
goto skip_optional_pos;
}
}
if (fastargs[3]) {
emax = fastargs[3];
if (!--noptargs) {
goto skip_optional_pos;
}
}
if (fastargs[4]) {
capitals = fastargs[4];
if (!--noptargs) {
goto skip_optional_pos;
}
}
if (fastargs[5]) {
clamp = fastargs[5];
if (!--noptargs) {
goto skip_optional_pos;
}
}
if (fastargs[6]) {
status = fastargs[6];
if (!--noptargs) {
goto skip_optional_pos;
}
}
traps = fastargs[7];
skip_optional_pos:
return_value = context_init_impl(self, prec, rounding, emin, emax, capitals, clamp, status, traps);
exit:
return return_value;
}
PyDoc_STRVAR(_decimal_IEEEContext__doc__,
"IEEEContext($module, bits, /)\n"
"--\n"
@ -90,6 +250,24 @@ exit:
return return_value;
}
PyDoc_STRVAR(_decimal_Context_copy__doc__,
"copy($self, /)\n"
"--\n"
"\n"
"Return a duplicate of the context with all flags cleared.");
#define _DECIMAL_CONTEXT_COPY_METHODDEF \
{"copy", (PyCFunction)_decimal_Context_copy, METH_NOARGS, _decimal_Context_copy__doc__},
static PyObject *
_decimal_Context_copy_impl(PyObject *self);
static PyObject *
_decimal_Context_copy(PyObject *self, PyObject *Py_UNUSED(ignored))
{
return _decimal_Context_copy_impl(self);
}
PyDoc_STRVAR(_decimal_getcontext__doc__,
"getcontext($module, /)\n"
"--\n"
@ -311,6 +489,18 @@ _decimal_Decimal_from_number(PyObject *type, PyObject *number)
return return_value;
}
PyDoc_STRVAR(_decimal_Context_create_decimal_from_float__doc__,
"create_decimal_from_float($self, f, /)\n"
"--\n"
"\n"
"Create a new Decimal instance from float f.\n"
"\n"
"Unlike the Decimal.from_float() class method, this function observes\n"
"the context limits.");
#define _DECIMAL_CONTEXT_CREATE_DECIMAL_FROM_FLOAT_METHODDEF \
{"create_decimal_from_float", (PyCFunction)_decimal_Context_create_decimal_from_float, METH_O, _decimal_Context_create_decimal_from_float__doc__},
PyDoc_STRVAR(dec_new__doc__,
"Decimal(value=\'0\', context=None)\n"
"--\n"
@ -385,6 +575,41 @@ exit:
return return_value;
}
PyDoc_STRVAR(_decimal_Context_create_decimal__doc__,
"create_decimal($self, num=\'0\', /)\n"
"--\n"
"\n"
"Create a new Decimal instance from num, using self as the context.\n"
"\n"
"Unlike the Decimal constructor, this function observes the context\n"
"limits.");
#define _DECIMAL_CONTEXT_CREATE_DECIMAL_METHODDEF \
{"create_decimal", _PyCFunction_CAST(_decimal_Context_create_decimal), METH_FASTCALL, _decimal_Context_create_decimal__doc__},
static PyObject *
_decimal_Context_create_decimal_impl(PyObject *context, PyObject *num);
static PyObject *
_decimal_Context_create_decimal(PyObject *context, PyObject *const *args, Py_ssize_t nargs)
{
PyObject *return_value = NULL;
PyObject *num = NULL;
if (!_PyArg_CheckPositional("create_decimal", nargs, 0, 1)) {
goto exit;
}
if (nargs < 1) {
goto skip_optional;
}
num = args[0];
skip_optional:
return_value = _decimal_Context_create_decimal_impl(context, num);
exit:
return return_value;
}
PyDoc_STRVAR(_decimal_Decimal___format____doc__,
"__format__($self, format_spec, override=<unrepresentable>, /)\n"
"--\n"
@ -4011,6 +4236,36 @@ exit:
return return_value;
}
PyDoc_STRVAR(_decimal_Context_divmod__doc__,
"divmod($self, x, y, /)\n"
"--\n"
"\n"
"Return quotient and remainder of the division x / y.");
#define _DECIMAL_CONTEXT_DIVMOD_METHODDEF \
{"divmod", _PyCFunction_CAST(_decimal_Context_divmod), METH_FASTCALL, _decimal_Context_divmod__doc__},
static PyObject *
_decimal_Context_divmod_impl(PyObject *context, PyObject *x, PyObject *y);
static PyObject *
_decimal_Context_divmod(PyObject *context, PyObject *const *args, Py_ssize_t nargs)
{
PyObject *return_value = NULL;
PyObject *x;
PyObject *y;
if (!_PyArg_CheckPositional("divmod", nargs, 2, 2)) {
goto exit;
}
x = args[0];
y = args[1];
return_value = _decimal_Context_divmod_impl(context, x, y);
exit:
return return_value;
}
PyDoc_STRVAR(_decimal_Context_power__doc__,
"power($self, /, a, b, modulo=None)\n"
"--\n"
@ -4225,6 +4480,73 @@ PyDoc_STRVAR(_decimal_Context_is_zero__doc__,
#define _DECIMAL_CONTEXT_IS_ZERO_METHODDEF \
{"is_zero", (PyCFunction)_decimal_Context_is_zero, METH_O, _decimal_Context_is_zero__doc__},
PyDoc_STRVAR(_decimal_Context_is_canonical__doc__,
"is_canonical($self, x, /)\n"
"--\n"
"\n"
"Return True if x is canonical, False otherwise.");
#define _DECIMAL_CONTEXT_IS_CANONICAL_METHODDEF \
{"is_canonical", (PyCFunction)_decimal_Context_is_canonical, METH_O, _decimal_Context_is_canonical__doc__},
PyDoc_STRVAR(_decimal_Context__apply__doc__,
"_apply($self, x, /)\n"
"--\n"
"\n"
"Apply self to Decimal x.");
#define _DECIMAL_CONTEXT__APPLY_METHODDEF \
{"_apply", (PyCFunction)_decimal_Context__apply, METH_O, _decimal_Context__apply__doc__},
#if defined(EXTRA_FUNCTIONALITY)
PyDoc_STRVAR(_decimal_Context_apply__doc__,
"apply($self, x, /)\n"
"--\n"
"\n"
"Apply self to Decimal x.");
#define _DECIMAL_CONTEXT_APPLY_METHODDEF \
{"apply", (PyCFunction)_decimal_Context_apply, METH_O, _decimal_Context_apply__doc__},
#endif /* defined(EXTRA_FUNCTIONALITY) */
PyDoc_STRVAR(_decimal_Context_canonical__doc__,
"canonical($self, x, /)\n"
"--\n"
"\n"
"Return a new instance of x.");
#define _DECIMAL_CONTEXT_CANONICAL_METHODDEF \
{"canonical", (PyCFunction)_decimal_Context_canonical, METH_O, _decimal_Context_canonical__doc__},
PyDoc_STRVAR(_decimal_Context_copy_abs__doc__,
"copy_abs($self, x, /)\n"
"--\n"
"\n"
"Return a copy of x with the sign set to 0.");
#define _DECIMAL_CONTEXT_COPY_ABS_METHODDEF \
{"copy_abs", (PyCFunction)_decimal_Context_copy_abs, METH_O, _decimal_Context_copy_abs__doc__},
PyDoc_STRVAR(_decimal_Context_copy_decimal__doc__,
"copy_decimal($self, x, /)\n"
"--\n"
"\n"
"Return a copy of Decimal x.");
#define _DECIMAL_CONTEXT_COPY_DECIMAL_METHODDEF \
{"copy_decimal", (PyCFunction)_decimal_Context_copy_decimal, METH_O, _decimal_Context_copy_decimal__doc__},
PyDoc_STRVAR(_decimal_Context_copy_negate__doc__,
"copy_negate($self, x, /)\n"
"--\n"
"\n"
"Return a copy of x with the sign inverted.");
#define _DECIMAL_CONTEXT_COPY_NEGATE_METHODDEF \
{"copy_negate", (PyCFunction)_decimal_Context_copy_negate, METH_O, _decimal_Context_copy_negate__doc__},
PyDoc_STRVAR(_decimal_Context_logb__doc__,
"logb($self, x, /)\n"
"--\n"
@ -4243,6 +4565,33 @@ PyDoc_STRVAR(_decimal_Context_logical_invert__doc__,
#define _DECIMAL_CONTEXT_LOGICAL_INVERT_METHODDEF \
{"logical_invert", (PyCFunction)_decimal_Context_logical_invert, METH_O, _decimal_Context_logical_invert__doc__},
PyDoc_STRVAR(_decimal_Context_number_class__doc__,
"number_class($self, x, /)\n"
"--\n"
"\n"
"Return an indication of the class of x.");
#define _DECIMAL_CONTEXT_NUMBER_CLASS_METHODDEF \
{"number_class", (PyCFunction)_decimal_Context_number_class, METH_O, _decimal_Context_number_class__doc__},
PyDoc_STRVAR(_decimal_Context_to_sci_string__doc__,
"to_sci_string($self, x, /)\n"
"--\n"
"\n"
"Convert a number to a string using scientific notation.");
#define _DECIMAL_CONTEXT_TO_SCI_STRING_METHODDEF \
{"to_sci_string", (PyCFunction)_decimal_Context_to_sci_string, METH_O, _decimal_Context_to_sci_string__doc__},
PyDoc_STRVAR(_decimal_Context_to_eng_string__doc__,
"to_eng_string($self, x, /)\n"
"--\n"
"\n"
"Convert a number to a string, using engineering notation.");
#define _DECIMAL_CONTEXT_TO_ENG_STRING_METHODDEF \
{"to_eng_string", (PyCFunction)_decimal_Context_to_eng_string, METH_O, _decimal_Context_to_eng_string__doc__},
PyDoc_STRVAR(_decimal_Context_compare_total__doc__,
"compare_total($self, x, y, /)\n"
"--\n"
@ -4305,6 +4654,36 @@ exit:
return return_value;
}
PyDoc_STRVAR(_decimal_Context_copy_sign__doc__,
"copy_sign($self, x, y, /)\n"
"--\n"
"\n"
"Copy the sign from y to x.");
#define _DECIMAL_CONTEXT_COPY_SIGN_METHODDEF \
{"copy_sign", _PyCFunction_CAST(_decimal_Context_copy_sign), METH_FASTCALL, _decimal_Context_copy_sign__doc__},
static PyObject *
_decimal_Context_copy_sign_impl(PyObject *context, PyObject *x, PyObject *y);
static PyObject *
_decimal_Context_copy_sign(PyObject *context, PyObject *const *args, Py_ssize_t nargs)
{
PyObject *return_value = NULL;
PyObject *x;
PyObject *y;
if (!_PyArg_CheckPositional("copy_sign", nargs, 2, 2)) {
goto exit;
}
x = args[0];
y = args[1];
return_value = _decimal_Context_copy_sign_impl(context, x, y);
exit:
return return_value;
}
PyDoc_STRVAR(_decimal_Context_logical_and__doc__,
"logical_and($self, x, y, /)\n"
"--\n"
@ -4486,4 +4865,39 @@ _decimal_Context_shift(PyObject *context, PyObject *const *args, Py_ssize_t narg
exit:
return return_value;
}
/*[clinic end generated code: output=db00589bcc7a168d input=a9049054013a1b77]*/
PyDoc_STRVAR(_decimal_Context_same_quantum__doc__,
"same_quantum($self, x, y, /)\n"
"--\n"
"\n"
"Return True if the two operands have the same exponent.");
#define _DECIMAL_CONTEXT_SAME_QUANTUM_METHODDEF \
{"same_quantum", _PyCFunction_CAST(_decimal_Context_same_quantum), METH_FASTCALL, _decimal_Context_same_quantum__doc__},
static PyObject *
_decimal_Context_same_quantum_impl(PyObject *context, PyObject *x,
PyObject *y);
static PyObject *
_decimal_Context_same_quantum(PyObject *context, PyObject *const *args, Py_ssize_t nargs)
{
PyObject *return_value = NULL;
PyObject *x;
PyObject *y;
if (!_PyArg_CheckPositional("same_quantum", nargs, 2, 2)) {
goto exit;
}
x = args[0];
y = args[1];
return_value = _decimal_Context_same_quantum_impl(context, x, y);
exit:
return return_value;
}
#ifndef _DECIMAL_CONTEXT_APPLY_METHODDEF
#define _DECIMAL_CONTEXT_APPLY_METHODDEF
#endif /* !defined(_DECIMAL_CONTEXT_APPLY_METHODDEF) */
/*[clinic end generated code: output=1e10ddd6610e17dc input=a9049054013a1b77]*/

View file

@ -1,129 +0,0 @@
/*
* Copyright (c) 2001 Python Software Foundation. All Rights Reserved.
* Modified and extended by Stefan Krah.
*/
#ifndef DOCSTRINGS_H
#define DOCSTRINGS_H
#include "pymacro.h"
/******************************************************************************/
/* Context Object and Methods */
/******************************************************************************/
PyDoc_STRVAR(doc_context,
"Context(prec=None, rounding=None, Emin=None, Emax=None, capitals=None, clamp=None, flags=None, traps=None)\n--\n\n\
The context affects almost all operations and controls rounding,\n\
Over/Underflow, raising of exceptions and much more. A new context\n\
can be constructed as follows:\n\
\n\
>>> c = Context(prec=28, Emin=-425000000, Emax=425000000,\n\
... rounding=ROUND_HALF_EVEN, capitals=1, clamp=1,\n\
... traps=[InvalidOperation, DivisionByZero, Overflow],\n\
... flags=[])\n\
>>>\n\
\n\
\n");
#ifdef EXTRA_FUNCTIONALITY
PyDoc_STRVAR(doc_ctx_apply,
"apply($self, x, /)\n--\n\n\
Apply self to Decimal x.\n\
\n");
#endif
PyDoc_STRVAR(doc_ctx_clear_flags,
"clear_flags($self, /)\n--\n\n\
Reset all flags to False.\n\
\n");
PyDoc_STRVAR(doc_ctx_clear_traps,
"clear_traps($self, /)\n--\n\n\
Set all traps to False.\n\
\n");
PyDoc_STRVAR(doc_ctx_copy,
"copy($self, /)\n--\n\n\
Return a duplicate of the context with all flags cleared.\n\
\n");
PyDoc_STRVAR(doc_ctx_copy_decimal,
"copy_decimal($self, x, /)\n--\n\n\
Return a copy of Decimal x.\n\
\n");
PyDoc_STRVAR(doc_ctx_create_decimal,
"create_decimal($self, num=\"0\", /)\n--\n\n\
Create a new Decimal instance from num, using self as the context. Unlike the\n\
Decimal constructor, this function observes the context limits.\n\
\n");
PyDoc_STRVAR(doc_ctx_create_decimal_from_float,
"create_decimal_from_float($self, f, /)\n--\n\n\
Create a new Decimal instance from float f. Unlike the Decimal.from_float()\n\
class method, this function observes the context limits.\n\
\n");
PyDoc_STRVAR(doc_ctx_canonical,
"canonical($self, x, /)\n--\n\n\
Return a new instance of x.\n\
\n");
PyDoc_STRVAR(doc_ctx_copy_abs,
"copy_abs($self, x, /)\n--\n\n\
Return a copy of x with the sign set to 0.\n\
\n");
PyDoc_STRVAR(doc_ctx_copy_negate,
"copy_negate($self, x, /)\n--\n\n\
Return a copy of x with the sign inverted.\n\
\n");
PyDoc_STRVAR(doc_ctx_copy_sign,
"copy_sign($self, x, y, /)\n--\n\n\
Copy the sign from y to x.\n\
\n");
PyDoc_STRVAR(doc_ctx_divmod,
"divmod($self, x, y, /)\n--\n\n\
Return quotient and remainder of the division x / y.\n\
\n");
PyDoc_STRVAR(doc_ctx_is_canonical,
"is_canonical($self, x, /)\n--\n\n\
Return True if x is canonical, False otherwise.\n\
\n");
PyDoc_STRVAR(doc_ctx_normalize,
"normalize($self, x, /)\n--\n\n\
Reduce x to its simplest form. Alias for reduce(x).\n\
\n");
PyDoc_STRVAR(doc_ctx_number_class,
"number_class($self, x, /)\n--\n\n\
Return an indication of the class of x.\n\
\n");
PyDoc_STRVAR(doc_ctx_same_quantum,
"same_quantum($self, x, y, /)\n--\n\n\
Return True if the two operands have the same exponent.\n\
\n");
PyDoc_STRVAR(doc_ctx_to_eng_string,
"to_eng_string($self, x, /)\n--\n\n\
Convert a number to a string, using engineering notation.\n\
\n");
PyDoc_STRVAR(doc_ctx_to_sci_string,
"to_sci_string($self, x, /)\n--\n\n\
Convert a number to a string using scientific notation.\n\
\n");
#endif /* DOCSTRINGS_H */

View file

@ -108,7 +108,6 @@
<ClInclude Include="$(mpdecimalDir)\libmpdec\convolute.h" />
<ClInclude Include="$(mpdecimalDir)\libmpdec\crt.h" />
<ClInclude Include="$(mpdecimalDir)\libmpdec\difradix2.h" />
<ClInclude Include="..\Modules\_decimal\docstrings.h" />
<ClInclude Include="$(mpdecimalDir)\libmpdec\fnt.h" />
<ClInclude Include="$(mpdecimalDir)\libmpdec\fourstep.h" />
<ClInclude Include="..\Modules\_decimal\windows\mpdecimal.h" />

View file

@ -18,9 +18,6 @@
</Filter>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\Modules\_decimal\docstrings.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="$(mpdecimalDir)\libmpdec\basearith.h">
<Filter>Header Files\libmpdec</Filter>
</ClInclude>