[英]In the Python C API, if the second argument is not set how can I default to the value of the first?
我有一个 x, y 参数。 使用 python C API,如果 y 为 None,我如何将 y 默认为 x 的值。
python 等效项是:
def scale(x: float, y:Optional[float]=None):
if y is None:
y = x
c_scale_api(x, y)
只需对照Py_None
检查它。
static PyObject* scale(PyObject* self, PyObject* args) {
PyObject* input2 = Py_None; // initialize to None
double input1d, input2d;
if (!PyArg_ParseTuple(args, "d|O", &input1d, &input2)) {
return NULL;
}
if (input2 == Py_None)
{
input2d = input1d;
}
else
{
input2d = PyFloat_AsDouble(input2);
}
return PyFloat_FromDouble(input2d);
}
这将返回第二个参数的值供您检查。
您可以使用|
到 state 解析 arg 元组时,一些 arguments 是可选的。 您必须确保|
之后的任何 arguments 在使用它们之前总是有一个值。 也就是说,如果参数不存在, PyArg_ParseTuple
将保持变量不变。 通常,这意味着您应该在调用PyArg_ParseTuple
之前分配默认值。 但是,由于您的要求,我们可以检查我们实际获得了多少个参数,然后如果只给出 1 个参数,则将其分配给y
。
此代码将使第二个参数可选,但不完全等同于 python function。 也就是说None
不是第二个参数的有效值。 所以scale(1, 2)
和scale(1)
都很好,但是scale(1, None)
会失败。
static PyObject*
scale(PyObject* self, PyObject* args) // type: METH_VARARGS
{
double x;
double y;
if (!PyArg_ParseTuple(args, "d|d", &x, &y)) {
return NULL;
}
if (PyTuple_GET_SIZE(args) == 1) {
y = x;
}
return PyFloat_FromDouble(x + y);
}
对于完全等效的 C function,请尝试以下操作。 现在像scale(x=1, y=None)
这样的东西也会起作用。
static PyObject*
scale(PyObject* self, PyObject* args, PyObject* kwargs) // type: METH_VARARGS | METH_KEYWORDS
{
static char* keywords[] = { "x", "y", NULL };
double x;
double y;
PyObject* y_obj;
if (
!PyArg_ParseTupleAndKeywords(
args, kwargs, "d|O:scale", keywords, &x, &y_obj
)
) {
return NULL;
}
if (y_obj == Py_None) {
y = x;
} else if (PyFloat_Check(y_obj)) {
y = PyFloat_AS_DOUBLE(y_obj);
} else if (PyLong_Check(y_obj)) {
y = PyLong_AS_LONG(y_obj);
} else {
PyErr_SetString(PyExc_TypeError, "y must be float | int | None");
return NULL;
}
return PyFloat_FromDouble(x + y);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.