Jeremy Kloth added the comment:
IMHO, this is a documentation bug with PyObject_CallMethod. The change to its
documentation to differ from PyObject_CallFunction was changed back in 2004.
It should have been updated then to reflect the already well-entrenched
behavior of those 2 (at the time) functions, but that ship has sailed.
It would be a huge mistake to change how they handle the format strings now as
they have operated they way they have since at least Python 1.5.2 (when I
learned Python's C API). There is just too much C code that would potentially
break (third-party C extensions).
I think that a good change for the docs would be to separate the specification
of the "building format string" away from the Py_BuildValue function so as to
allow for differences in how the resulting object is created in those C
functions that use that specification. Similar, I suppose, to how the "parsing
format string" is defined independently from PyArg_ParseTuple.
Now to the "attractive nuisance" that the single argument passed as varargs is
handled. I believe it may be best to introduce a new format character just for
this purpose. Possibly "T" (for tuple) or "V" (for varargs) using uppercase as
that seems to be the practice for referencing objects. And at the same time,
add a check in the "call" functions (those that *use* Py_VaBuildValue to create
a argument tuple, of which there are also internal ones). The check could be
as simple as:
if (format[0] == 'O' && format[1] == '\0') {
va_start(va, format);
PyObject *ob = (PyObject *)va_arg(va, PyObject *);
if (ob != NULL) {
if (PyTuple_Check(ob)) {
if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
"use 'V' format code to support varargs")) {
args = NULL;
}
else {
args = ob;
}
}
else {
args = PyTuple_Pack(1, ob);
}
}
else if (!PyErr_Occurred()) {
PyErr_SetString(PyExc_SystemError, "argument is NULL");
args = NULL;
}
va_end(va);
}
else {
args = //...whatever happens now...
}
----------
nosy: +jkloth
_______________________________________
Python tracker <[email protected]>
<http://bugs.python.org/issue26820>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com